Not sure of downfalls using strict global state implementation. When is singleton not ideal for an application?
Singleton is generally a bad idea if you are doing unit testing, and its generally a bad idea not to do unit testing (or BDD or Acceptance Testing).
Making objects have global state means that the unit tests you write involving these objects will be isolated and disjoint from one another. Instead, you will have to worry about resetting the state for each test and believe me … that is never done 100% of the time. If you don’t reset the global state then you start to get very weird and hard to debug errors in your tests that waste time.
Global state also increases coupling in your code and makes it very hard to refactor.
The ideal method would be to use an IoC/DI container (Spring, Guice, etc.) to request objects. These containers often have ways of making objects appear as ‘Singletons’ but they also have ways of modifying that behavior depending on the situation (i.e. unit testing vs. your domain code).
This all depends on the size of your problem of course. If you’re hacking together a 4-class test rig to try something out then go ahead and use a Singleton. However, as soon as that project takes on life and grows bigger and more complex then refactor the Singleton out.