>Why singletons and not static variables?

It’s a getter. 

If you let everything that needed your ‘manager’ access it directly you wouldn’t be able run code on access without rewriting everything that accesses it. 

For example, to change it from greedy loading to lazy loading you now need to run code later, on access, even if only once. 

And so you’re stuck writing boiler plate getter code even when, right now, you don’t need it. 

That is, unless you have [properties](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties). Like you do in C#. With those you don’t have to write getter code until you need getter code. Something I get jealous of every time I touch Java. 

So why singletons and not static when greedy loading is fine? Because it was written in Java. Or by a Java coder. 

>But singletons are evil!

If you’re stuck in some framework with no access to main or any function that’s only called once (hence no composition root) then they are still useful. Even if they are evil globals. Use them and access them sparingly. If anyone gives you crap about them when you’re stuck in this situation ask them for a better idea.