cleanup: Don't use private struct for final types
All those types were declared as final, so dropped the use of a priv field. See commits.
I have intentionally split everything in smaller chunks to make it easy to review, but can squash things later once approved.