However, I've looked at some game libraries and engines (most prominently libGDX and Unity) and I've noticed they have no shame with exposing a lot of data structures globally.
libGDX? You're using libGDX as a reference of some sort?
Take a look:
Thats exactly what it looks like. A static float, whats its used for? Oh nothing too important, just holding effin intermediary results in math functions.
What does that means? That you can't possibly invert a matrix on two separate threads because it will fuck something up. Read that again: You can't use libGDX's math functions on more than one thread. And you know what? Its not the only static used that way in libGDX.
I'll just leave you with that bit of information.
EDIT: More on topic -> Eff singletons. All of them. I'd simply copy-paste swiftwcoder's words here.