Singletons are often badly implemented. See double-checked-locking.
In which scope must an Singleton instance be unique. Like multi-Threaded environments, clustering etc.
Singletons can be hard to test.
Memory allocated to an Singleton can't be freed.
With excessiv usage of singletons you leave from objectoriented programming to procedural programming.