diff --git a/MetaObject.cabal b/MetaObject.cabal
--- a/MetaObject.cabal
+++ b/MetaObject.cabal
@@ -1,6 +1,6 @@
 name:               MetaObject
-version:            0.0.6.20110925
-copyright:          2006 Caio Marcelo, 2008 Audrey Tang
+version:            0.0.6.20150815
+copyright:          2006 Caio Marcelo, 2008-2015 Audrey Tang
 license:            BSD3
 license-file:       LICENSE
 author:             Audrey Tang <audreyt@audreyt.org>
@@ -9,6 +9,7 @@
 description:        A meta-object system for Haskell based on Perl 6
 stability:          experimental
 build-type:         Simple
+Tested-With:        GHC==7.10.2
 category:           Development, Pugs
 exposed-modules:    MO.Base MO.Compile.Attribute MO.Compile.Class
                     MO.Compile.Role MO.Compile MO.Run MO.Util MO.Capture MO.Util.C3
diff --git a/src/MO/Base.hs b/src/MO/Base.hs
--- a/src/MO/Base.hs
+++ b/src/MO/Base.hs
@@ -21,6 +21,7 @@
     = forall a. (Show a, Eq a, Ord a, Typeable a) => MkInvocant
         a                   -- Invocant
         (AnyResponder m)    -- Responder
+      deriving Typeable
 
 -- | open type to represent Code
 class Monad m => Codeable m c where
diff --git a/src/MO/Compile/Class.hs b/src/MO/Compile/Class.hs
--- a/src/MO/Compile/Class.hs
+++ b/src/MO/Compile/Class.hs
@@ -8,7 +8,7 @@
 import MO.Compile.Role
 import MO.Run
 import MO.Util
-import Data.Typeable (Typeable1, Typeable(..), typeOf1, mkTyCon, mkTyConApp)
+import Data.Typeable (Typeable1, Typeable(..))
 import Control.Monad (liftM)
 import Data.Monoid
 import qualified Data.Typeable as Typeable
@@ -74,9 +74,7 @@
                        . all_methods
 
 data AnyClass m = forall c. Class m c => MkClass !c
-
-instance (Typeable1 m, Monad m) => Typeable (AnyClass m) where
-    typeOf _ = mkTyConApp (mkTyCon "AnyClass") [typeOf1 (undefined :: m ())]
+                deriving Typeable
 
 instance (Typeable1 m, Monad m) => Eq (AnyClass m) where
     MkClass x == MkClass y = case Typeable.cast y of
@@ -115,6 +113,7 @@
         , moc_private_methods        :: Collection (AnyMethod m)
         , moc_name                   :: ClassName
         }
+    deriving Typeable
         -- deriving (Eq)
 
 instance (Typeable1 m, Monad m) => Show (MOClass m) where
@@ -123,8 +122,6 @@
     compare = compare `on` moc_name
 instance (Typeable1 m, Monad m) => Eq (MOClass m) where
     (==) = (==) `on` moc_name
-instance (Typeable1 m, Monad m) => Typeable (MOClass m) where
-    typeOf _ = mkTyConApp (mkTyCon "MOClass") [typeOf1 (undefined :: m ())]
 
 emptyMOClass :: (Typeable1 m, Monad m) => MOClass m
 emptyMOClass = MkMOClass
diff --git a/src/MO/Run.hs b/src/MO/Run.hs
--- a/src/MO/Run.hs
+++ b/src/MO/Run.hs
@@ -92,10 +92,7 @@
 
 
 data AnyResponder m = forall c. ResponderInterface m c => MkResponder !(m c)
-
-instance (Typeable1 m, Monad m) => Typeable (AnyResponder m) where
-    typeOf _ = mkTyConApp (mkTyCon "AnyResponder") [typeOf1 (undefined :: m ())]
-
+                    deriving Typeable
 
 
 -- Invocant represent an object aggregated with an ResponderInterface
@@ -106,9 +103,6 @@
     Just y -> return y
     _      -> fail $ "Could not coerce from " ++ (show $ typeOf x) ++ " to " ++ (show $ typeOf (undefined :: b))
 
-
-instance (Typeable1 m, Monad m) => Typeable (Invocant m) where
-    typeOf _ = mkTyConApp (mkTyCon "Invocant") [typeOf1 (undefined :: m ())]
 
 ivDispatch :: (Typeable1 m, Monad m) => Invocant m -> MethodInvocation m -> m (Invocant m)
 ivDispatch i@(MkInvocant _ (MkResponder ri)) mi = do
diff --git a/src/MO/Run.hs-boot b/src/MO/Run.hs-boot
--- a/src/MO/Run.hs-boot
+++ b/src/MO/Run.hs-boot
@@ -1,7 +1,8 @@
 {-# OPTIONS_GHC -fglasgow-exts -fno-warn-orphans #-}
-{-# LANGUAGE KindSignatures #-}
+{-# LANGUAGE KindSignatures, RoleAnnotations #-}
 module MO.Run where
 import Data.Typeable
+type role AnyResponder nominal
 data AnyResponder (m :: * -> *)
 emptyResponder :: (Typeable1 m, Monad m) => AnyResponder m
 
diff --git a/src/MO/Util.hs b/src/MO/Util.hs
--- a/src/MO/Util.hs
+++ b/src/MO/Util.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE BangPatterns #-}
 {-# OPTIONS_GHC -fglasgow-exts #-}
 
 module MO.Util (
@@ -47,7 +48,7 @@
 
 {-# INLINE addressOf #-}
 addressOf :: a -> Word
-addressOf x = W# (unsafeCoerce# x)
+addressOf !x = W# (unsafeCoerce# x)
 
 data Ord a => Collection a
     = MkCollection
diff --git a/src/MO/Util/C3.hs b/src/MO/Util/C3.hs
--- a/src/MO/Util/C3.hs
+++ b/src/MO/Util/C3.hs
@@ -114,7 +114,7 @@
 
         
 
-data Object =
+data Mu =
  O | A | B | C | D | E | F | G | H | I | J | K | K1 | K2 | K3 | X | Y | Z
  deriving (Eq, Show)
 
