The included plus base.extend(ClassMethods) pattern is clear. One thing to check in the InstanceCounter example: Person and Animal define their own initialize in the class body, and a method defined on the class wins over one from an included module. So InstanceMethods#initialize never runs and the counts stay at 0. Using base.prepend(InstanceMethods) puts the module in front of the class in the ancestor chain, so its initialize runs first and super reaches the class's version. Easy to confirm with Person.ancestors.