diff --git a/Data/Algebra.hs b/Data/Algebra.hs
--- a/Data/Algebra.hs
+++ b/Data/Algebra.hs
@@ -23,6 +23,7 @@
     -- * Classes
   , Algebra(..)
   , algebraA
+  , Signature(..)
   , AlgebraSignature(..)
   ) where
 
diff --git a/Data/Algebra/Internal.hs b/Data/Algebra/Internal.hs
--- a/Data/Algebra/Internal.hs
+++ b/Data/Algebra/Internal.hs
@@ -25,6 +25,9 @@
 import Data.Monoid
 import Control.Arrow ((&&&))
 
+-- | The signature datatype for the class @c@.
+type family Signature (c :: * -> Constraint) :: * -> *
+
 class Traversable f => AlgebraSignature f where
   -- | The class for which @f@ is the signature.
   type Class f :: * -> Constraint
diff --git a/Data/Algebra/TH.hs b/Data/Algebra/TH.hs
--- a/Data/Algebra/TH.hs
+++ b/Data/Algebra/TH.hs
@@ -29,6 +29,7 @@
 import Data.Foldable (Foldable(foldMap))
 import Data.Traversable (Traversable, forM)
 import Data.Monoid (Endo(..))
+import Data.Maybe (catMaybes)
 
 import Language.Haskell.TH
 import Data.Generics (Data, everywhere, mkT)
@@ -55,10 +56,12 @@
   let sigName = changeName (++ "Signature") name
   ops <- forM decs $ \(SigD nm (ForallT [PlainTV tv'] _ tp)) -> do
     ClassOpI _ _ _ fty <- reify nm
-    Just (ar, mkCon) <- return $ buildOperation tv' tp
-    let opName = changeName ("Op_" ++) nm
-    return $ OperationTH nm opName ar (everywhere (mkT (rename tv' tv)) (mkCon opName)) fty
-  return $ SignatureTH sigName tv ops
+    return $ case buildOperation tv' tp of
+      Just (ar, mkCon) -> 
+        let opName = changeName ("Op_" ++) nm
+        in Just $ OperationTH nm opName ar (everywhere (mkT (rename tv' tv)) (mkCon opName)) fty
+      _ -> Nothing
+  return $ SignatureTH sigName tv $ catMaybes ops
 
 -- | Derive a signature for an algebraic class.
 --   For example:
@@ -146,9 +149,10 @@
     [''Functor, ''Foldable, ''Traversable, ''Eq, ''Ord]]
 
 signatureInstances :: Name -> SignatureTH -> [Dec]
-signatureInstances nm s = [asInst, showInst]
+signatureInstances nm s = [asInst, showInst, sigTFInst]
   where
     signature = ConT (signatureName s)
+    sigTFInst = TySynInstD ''Signature [ConT nm] signature
     typeInst = TySynInstD ''Class [signature] (ConT nm)
     asClauses = 
       [ Clause [ConP opName (map VarP args)] (NormalB (foldl (\e arg -> AppE e (VarE arg)) (VarE fName) args)) []
diff --git a/algebraic-classes.cabal b/algebraic-classes.cabal
--- a/algebraic-classes.cabal
+++ b/algebraic-classes.cabal
@@ -1,5 +1,5 @@
 name:                algebraic-classes
-version:             0.4
+version:             0.5
 synopsis:            Conversions between algebraic classes and F-algebras.
 description:         Algebraic classes are type classes where all the methods return a value of the same type, which is also the class parameter.
                      Examples from @base@ are @Num@ and @Monoid@.
