I had good experiences with a project that shipped with a distribution but actually had a kernel-specific component (this was actually on Solaris, but the experience is similar).
We switched on the interface version number to allow the kernel/userspace components to develop independently while we were developing, so no-one could suffer from version skew, and cleaned out all old version each time the kernel rev'd. That allowed us to avoid the Windows-style backwards compatibility bugs.
We also used versioned interfaces internally, so we could develop different parts in parallel and not have flag days.