Why does nvidia driver 346 work while driver 384 doesn't [closed]

Per OP's comment, installing a later kernel helped (the 4.4, linux-generic-lts-xenial package).

Hence this is a Ubuntu packaging bug which I'd recommend to report. They should add a later kernel to dependencies of NVidia-384 (4.4 will surely do the work).

Ultimately, kernel have no stable interface for working with modules, which is on purpose — it's one of reasons that despite being 26 years old it is still being modern and well developed. It is being refactored in and out every time, internal interfaces being dropped, added, rewritten, improved, etc.

It's good, and is in fact desirable for card manufacturers with drivers in kernel (e.g. Intel and AMD). But NVidia for political reasons keeps the code closed, instead they're using DKMS to work with the internal unstable API. And in your case what apparently happened is some breaking change on the way from 3.16 to 4.4, which caused the NVidia kernel driver to fail.

FTR, please note the distinction between kernel GPU drivers (which I'm talking about) and userspace GPU drivers (being a component to kernel ones).

Also FYI, 3.16 is not old, because 4.4 is. 3.16 is ancient.