An alternative, which I use myself, is to put all the methods etc you had intended for the sub-class into a module and perform an instance extend after you have the Geom::Point3d instance.
You can see the module I use in TT_Lib2 for instance: https://bitbucket.org/thomthom/tt-library-2/src/2bb264f27d9bc00c1b1f9a969e481c19385042ad/TT_Lib2/point3d_ex.rb?at=Version%202.9
When I receive a Point3D object I can use: point.extend(TT::Point3d_Ex)
From that point on all the content of that module is available for that instance.