Set Game State from String
this.state = (State) Class.forName("state"+state).getConstructor().newInstance();


This looks for a class named "stateWhatever", which isn't what you're doing below. Let's assume it's an error which happened when you copied the code.



private  void setState (String state) {
    switch (state) {
        case "Title":
            this.state = new Title ();
            break;
        case ....................
        default:
            System.out.println ("Tried to set state to " + state.toString() + ", but no such state exists.");
    }
}


Yes, this is going to get pretty long. But don't you simply separate the setting of the state from its computation?

 private State getState() {
    switch (state) {
        case "Title": 
            return new Title ();
        case ....


Here, you save one line, you could save another one if your conventions allow it and that's the optimum.

In case you can precreate your states, then simply

private static final Map&lt;String, State&gt; stateMap;
static {
     Map&lt;String, State&gt; map = new Map&lt;&gt;();
     map.put("Title", new Title()):
     ...
     stateMap = Collections.unmodifieableMap(map);
}


would do. The usage is obvious.



In case you can't precreate your states, then you could create a

private static final Map&lt;String, Class&lt;? extends State&gt;&gt; stateClassMap;


and use reflection for the instance creation.



You're having many implementation of state and each of them has a no-args constructor. This looks like an enum.



    System.out.println ("Tried to set state to " + state.toString() + ", but no such state exists.");


You know that's no proper error handling, right?