Custom types are very useful and I wouldn't automatically prefer classes over types. Custom types are lighter, can be serialized and are very "simple". A custom type is a bag of fields with zero logic. You know what you are getting. This can be an advantage.
Properties vs. public variables is a matter of taste and you can't be wrong with properties.
The "Internal" fields are indeed a workaround for the lack of visibility scope in this case. Nothing is perfect