Consider the following sample code, that refuses to type check in Ocaml: ---start--- class r (x_init: int) = object method get_x : int = x_init end let f (r1: r) (r2: r) : bool = (r1#get_x = r2#get_x) class r' (x_init: int) = object inherit r x_init method get_xx : int = 2 * x_init end let q (r1: r') (r2: r') = f r1 r2 ---end--- r' is a subclass of r. The compiler complains: File "class1.ml", line 12, characters 28-30: This expression has type r' but is here used with type r The second object type has no method get_xx Now, I know r does not have method get_xx, but why on Earth should this matter? I can see that there can be an error if I feed to f something that has FEWER methods, but why should it be an error to feed to f something with MORE methods?? The absurdity continues: if I instead declare f as: let f (r1: ) (r2: ) : bool = (r1#get_x = r2#get_x) then the code type-checks. Why is this fine but f: r -> r -> bool causes a type error? The situation does not make sense to me. Can someone shed some light on what is going on? (This with Ocaml 3.10.0 in case it matters) Best, Luca