The Singleton design pattern is at odds with DI. While it's possible to open up a Singleton so much that DI and the Open/Closed Principle starts to make sense, this will change the Singleton so much that it almost stops being a Singleton.
Thread safety is one big issue that comes to mind when you start opening up a Singleton.
It's much better to simply define your services and classes without considering their scope too much. If you have an object that you would like to share between multiple consumers, most DI Containers have the concept of a Singleton lifetime, which mimics the benefits of the Singleton design pattern without suffering from any of the drawbacks.
In short: Singletons are evil and should be avoided.
Abstract Factory, on the other hand, is very useful for DI purposes.