Most of the statically typed OOP languages are build on the concept of class and of interface to make polymorphism happen at runtime:
Sometimes it’s not called "class" in the language, but it is nevertheless a class in the broader OOP sense (e.g. struct in C++ are classes; struct in C# are a like classes but with value semantic).
Sometimes it’s ...
It's Objects all the way down
Side Note: There are varying opinions on the definition of strong-typed language, and how that may or may not interact with the definition of static-typed language.
Now, I also need the classes to work as first class citizens so that classes themselves could be taken as function parameters or returned.
This is a good ...