The kernel ABI is very stable, but applications typically need to interact with parts of the operating system besides the kernel, and those parts are not as fanatical when it comes to providing stable interfaces.
For example, applications that need to do hostname and username resolution have to interface with NSS, and that breaks if you statically link glibc.
Another example is playing audio - this requires interfacing with some userspace audio system like JACK, PulseAudio, or now Pipewire. If you statically link libSDL, it won't work in 5-10 years with whatever the latest fad in audio playback is. But if you dynamically link libSDL, then you can't statically link glibc because libSDL may be linked with a newer version of glibc, causing a conflict.
Thus you end up with a quite a mess.