Ruby's C API is well-integrated to the point that just about anything you can do on the Ruby side can be done on the C side, including defining classes and methods at runtime.
It is easy to check types, raise errors, raise exceptions without explicit propagation and result testing, pass arguments cleanly, and associate objects and methods with classes. There is no need for reference counts, type objects, or method tables.