I might have a few things.
Designing games is a well studied topic. There are a lot of design-patterns like an event-queue or the update-loop if you are interested

a few more.
1. This might be just a name thing but why does your GameState need to be renderable? You might want to look into the
MVC-Pattern to seperate logic, data-model and view. For someone who is new to programming this pattern is awful but it makes it easier to switch the view if you want to change it later.
2. & 3. Static mutable states are problematic especially if you change the states from different threads.
- Do you need to access it from everywhere (and always the same instance) and it is not a constant? --> Make it a Singleton with thread-safe methods
- Is it a constant? Make it static-final
Other OO-Languages don't use the static concept because static members kinda destroy the whole OOP paradigm. So only use static members if you really need to. Scala for example doesn't have static members if you want a static method or constan you always put it into a singleton-object.