I once read an article (although I can't put my browser on it at the moment) by the great Thomas Kyte about this topic. One of the significant points he brought up was that when you recompile a procedure, it's dependancies become invalidated thereby ensuring an endless recompile nightmare. With packages, you only need to re-compile dependant objects when the package specification changes. As long as the interface to the package (specification) stays the same, you can change the logic (body) all you want without triggering massive recompilation.