Giorgio Sironi has posted a two part look at some techniques you can use to eliminate the singletons scattered through out your code (as sparked by the recent announcement that the Zend Framework project will be doing the same thing).
It is actually very simple to eliminate singletons: just force the components to ask for what they need in the constructor or via setters or via inject*() methods, instead of looking up a singleton trough a static method only to obtain a reference. Once this fundamental decoupling is achieved, the hard part is tackling the construction problem.
In the first part of the two, he looks at a Zend Framework example of how to replace a certain piece of code with injected instances of required objects. In the second part he refines it down a bit more and only inject/create the objects and resources as needed.