Also, it defines them as nested classes, and marks the outer class as `sealed`, as they're closed types, and it prevents the type being extended with new cases.
C# can't do this because the compiler rejects putting `abstract` and `sealed` on the same type.