Static linking might be semi-adequate for stuff that you compile at home, but for any code that's distributed using static is a sabotage.
I think you've got that backwards. Dynamic linking is fine for stuff you compile at home, but for any code that's distributed, using dynamic linking will often cause your binary to *just not work* on another system.
Missing a shared library? Which package does it come in? Oh crap, that package requires dependencies I don't have, or are the wrong version, etc.. Or you have the shared library, but it is a different version, and the size of a structure or something changed, or a variable doesn't exist anymore, and your binary crashes, won't run with it, or produces corrupt output. Or you go through all of your dependency Hell and update all the libraries you need to install the package with the missing shared library, only to find that the libraries you updated caused other programs to break for similar reasons to why yours wasn't working with your current library version. Newer versions of libraries do not always maintain binary compatibility with older versions.
Some programs should just be statically linked, so that they will always work on any version of any distribution. Otherwise, there may be no avoiding a recompile and its associated dependency Hell. Static linking is a compatibility God-send.