You must use singletones to modulate.
Imagine the following objects in singleton:
Printer prt; HTTPInfo httpInfo; PageConfig pgCfg; ConnectionPool cxPool;
Case 1 Imagine if you didn’t do this, but one class for storing all static fields / methods. Then you will have one large pool that you have to deal with.
Case 2
In your current case, you divided them into appropriate classes, but as static links. Then there will be too much noise, because each static property is now available to you. If you do not need information, especially when there is a lot of static information, you should limit the current scope of the code to the lack of information.
Preventing data clutter helps in maintenance and ensures that dependencies are limited. Somehow, having an idea of what is or is not available to me, in my current area of coding, helps me coding more efficiently.
Case 3 Resource Identifier.
Singletones make it easy to scale resources. Let's say you now have a single database, and so you set all its parameters as static in the MyConnection class. What if the time has come when you need to connect to multiple databases? If you encoded the connection information as a singleton code, raising the code would be relatively simple.
Case 4 Inheritance.
Single classes allow you to roll over. If you have a resource class, they can share common code. Say you have a BasicPrinter class that can be used as a singleton. Then you have LaserPrinter, which extends BasicPrinter.
If you used static tools, your code will break because you cannot access BasicPrinter.isAlive like LaserPrinter.isAlive. Then your single piece of code will not be able to manage different types of printers unless you place redundant code.
If you code in Java, you can still create a fully static content class and use the instance reference to access its static properties. If someone should do it, why not just make it a single?
Of course, extending Singleton classes has its own problems beyond this discussion, but there are simple ways to mitigate these problems.
Case 5 Avoid Information. There are so few pieces of information that need to be made globally available, like the largest and smallest integers. Why is Printer.isAlive allowed to make a stand? Only a very limited set of information should be admitted to the rostrum.
There is a saying: Think globally, act locally. Equivalently, a programmer should use singletones to think globally, but act locally.