diff --git a/Codec/TPTP/Base.hs b/Codec/TPTP/Base.hs
--- a/Codec/TPTP/Base.hs
+++ b/Codec/TPTP/Base.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE CPP, TemplateHaskell, NoMonomorphismRestriction, RecordWildCards
-  , StandaloneDeriving, MultiParamTypeClasses, FunctionalDependencies
+  , StandaloneDeriving 
   , TypeSynonymInstances, FlexibleInstances, FlexibleContexts
   , UndecidableInstances, DeriveDataTypeable, GeneralizedNewtypeDeriving
   , OverlappingInstances, ScopedTypeVariables
@@ -22,6 +22,8 @@
 import Prelude --hiding(concat,foldl,foldl1,foldr,foldr1)
 import Test.QuickCheck hiding ((.&.))
 import Util
+import Data.Pointed
+import Data.Copointed
     
 -- Should be in the standard library
 deriving instance Eq a => Eq (Identity a)
@@ -39,7 +41,7 @@
 -- | Basic (undecorated) terms
 type Term = T Identity
 
--- * Formulae and terms decoreated with state
+-- * Formulae and terms decorated with state
 
 -- | First-order formulae decorated with state
 type FormulaST s = F (State s)
@@ -53,7 +55,7 @@
 -- | Terms decorated with comments
 type TermC = TermST [String]
 
--- | Forget comments in formulae decoreated with comments
+-- | Forget comments in formulae decorated with comments
 forgetFC :: FormulaC -> Formula
 forgetFC (F f) = F . return $
   case evalState f [] of
@@ -63,7 +65,7 @@
     Quant quant vs f_     -> Quant quant vs (forgetFC f_)
     (:~:) f_              -> (:~:) (forgetFC f_)
 
--- | Forget comments in terms decoreated with comments
+-- | Forget comments in terms decorated with comments
 forgetTC :: TermC -> Term
 forgetTC (T t) = T . return $
   case evalState t [] of
@@ -75,7 +77,7 @@
 
 -- | Equivalence
 --
--- Don't let the type context of these wrapper function confuse you :) -- the important special case is just:
+-- Important special case:
 --
 -- @\(\.\<\=\>\.\) :: 'Formula' -> 'Formula' -> 'Formula'@
 (.<=>.) :: POINTED_FORMULA(c) => (F c) -> (F c) -> F c
@@ -180,20 +182,7 @@
                      
 
     
--- | Formulae whose subexpressions are wrapped in the given type constructor @c@.
---
--- For example:
---
--- - @c = 'Identity'@: Plain formulae
---
--- - @c = 'Maybe'@: Formulae that may contain \"holes\"
---
--- - @c = 'IORef'@: (Mutable) formulae with mutable subexpressions 
-newtype F c = F { runF :: c (Formula0 (T c) (F c)) }
     
--- | Terms whose subterms are wrapped in the given type constructor @c@
-newtype T c = T { runT :: c (Term0 (T c)) }
-    
 
 
 -- | Binary formula connectives 
@@ -240,7 +229,7 @@
 -- | A line of a TPTP file: Annotated formula (with the comment string embbeded in the State monad ), comment or include statement
 type TPTP_Input_C = TPTP_Input_ (State [String])
 
--- | Forget comments in a line of a TPTP file decoreated with comments
+-- | Forget comments in a line of a TPTP file decorated with comments
 forgetTIC :: TPTP_Input_C -> TPTP_Input
 forgetTIC tic@(AFormula {}) = tic { formula = forgetFC (formula tic) }
 forgetTIC (Comment s) = Comment s
@@ -275,8 +264,8 @@
 data UsefulInfo = NoUsefulInfo | UsefulInfo [GTerm]
                   deriving (Eq,Ord,Show,Read,Data,Typeable)
                            
--- | Formula roles -- why isn't this newtype??
-data Role = Role { unrole :: String }
+-- | Formula roles
+newtype Role = Role { unrole :: String }
             deriving (Eq,Ord,Show,Read,Data,Typeable)
 
 
@@ -548,6 +537,19 @@
         
 -- * Fixed-point style decorated formulae and terms
              
+-- | Formulae whose subexpressions are wrapped in the given type constructor @c@.
+--
+-- For example:
+--
+-- - @c = 'Identity'@: Plain formulae
+--
+-- - @c = 'Maybe'@: Formulae that may contain \"holes\"
+--
+-- - @c = 'IORef'@: (Mutable) formulae with mutable subexpressions 
+newtype F c = F { runF :: c (Formula0 (T c) (F c)) }
+    
+-- | Terms whose subterms are wrapped in the given type constructor @c@
+newtype T c = T { runT :: c (Term0 (T c)) }
              
 #define DI(X) deriving instance (X (c (Term0 (T c)))) => X (T c); deriving instance (X (c (Formula0 (T c) (F c)))) => X (F c)
     
@@ -565,38 +567,14 @@
 deriving instance (Typeable1 c, Data (c (Term0 (T c))))  => Data (T c)
 deriving instance (Typeable1 c, Data (c (Formula0 (T c) (F c)))) => Data (F c)
   
-        
--- | This class is used in several utility functions involving 'F' and 'T'.
---
--- Conceptually 'point' should be of type @a -> m a@, but we need the extra flexibility to make restricted monads like 'Set' instances. 
---
--- Note: We have @instance (Monad m) => Pointed a (m a)@, but Haddock currently doesn't display this.
-class Pointed a b | b -> a where
-    point :: a -> b
-
-instance (Monad m) => Pointed a (m a) where
-    point = return
-            
--- instance Ord a => Pointed a (Set a) where
---     point = S.singleton
-            
--- | This class is used in several utility functions involving 'F' and 'T'.
---
--- Conceptually 'copoint' should be of type @w a -> a@, but let's keep the extra flexibility. 
-class Copointed a b | b -> a where
-    copoint :: b -> a
-
-instance Copointed a (Identity a) where
-    copoint (Identity x) = x
-
 -- * Utility functions
 
 unwrapF ::
-            (Copointed (Formula0 (T t) (F t)) (t (Formula0 (T t) (F t)))) =>
+            (Copointed t) =>
             F t -> Formula0 (T t) (F t)
 unwrapF (F x) = copoint x
 unwrapT ::
-            (Copointed (Term0 (T t)) (t (Term0 (T t)))) =>
+            (Copointed t) =>
             T t -> Term0 (T t)
 unwrapT (T x) = copoint x
 
@@ -633,7 +611,7 @@
 
 -- | Eliminate formulae
 foldF ::
-         (Copointed (Formula0 (T t) (F t)) (t (Formula0 (T t) (F t)))) =>
+         (Copointed t) =>
            (F t -> r) -- ^ Handle negation
          -> (Quant -> [V] -> F t -> r) -- ^ Handle quantification
          -> (F t -> BinOp -> F t -> r) -- ^ Handle binary op
@@ -645,7 +623,7 @@
 
 -- | Eliminate terms
 foldT ::
-         (Copointed (Term0 (T t)) (t (Term0 (T t)))) =>
+         (Copointed t) =>
            (String -> r) -- ^ Handle string literal
          -> (Rational -> r) -- ^ Handle number literal
          -> (V -> r) -- ^ Handle variable
diff --git a/Codec/TPTP/Diff.hs b/Codec/TPTP/Diff.hs
--- a/Codec/TPTP/Diff.hs
+++ b/Codec/TPTP/Diff.hs
@@ -12,15 +12,10 @@
 -- Warning: This module is a MESS (but it seems to work :)).
     
 import Data.Generics
-import Control.Applicative()
-import Prelude hiding (putStrLn)
 import Test.QuickCheck hiding((.&.))
-import Data.Char()
-import Debug.Trace()
 import Codec.TPTP.Base
 import Codec.TPTP.Pretty
 import Text.PrettyPrint.ANSI.Leijen
-import System.UTF8IO
 import Control.Monad.Identity
     
     
@@ -331,7 +326,7 @@
 
 
 
-class Diffable a b where
+class Diffable a b | a -> b where
     diff :: a -> a -> b
 
 instance Diffable Formula (F DiffResult) where diff = diffFormula
diff --git a/Codec/TPTP/Export.hs b/Codec/TPTP/Export.hs
--- a/Codec/TPTP/Export.hs
+++ b/Codec/TPTP/Export.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE NoMonomorphismRestriction, RecordWildCards
-  , StandaloneDeriving, MultiParamTypeClasses, FunctionalDependencies
+  , StandaloneDeriving
   , TypeSynonymInstances, FlexibleInstances, FlexibleContexts
   , UndecidableInstances, DeriveDataTypeable, GeneralizedNewtypeDeriving
   , OverlappingInstances, RankNTypes
diff --git a/Codec/TPTP/Pretty.hs b/Codec/TPTP/Pretty.hs
--- a/Codec/TPTP/Pretty.hs
+++ b/Codec/TPTP/Pretty.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE NoMonomorphismRestriction, RecordWildCards
-  , StandaloneDeriving, MultiParamTypeClasses, FunctionalDependencies
+  , StandaloneDeriving
   , TypeSynonymInstances, FlexibleInstances, FlexibleContexts
   , UndecidableInstances, DeriveDataTypeable, GeneralizedNewtypeDeriving
   , OverlappingInstances, RankNTypes, PatternGuards
diff --git a/Codec/TPTP/QuickCheck.hs b/Codec/TPTP/QuickCheck.hs
--- a/Codec/TPTP/QuickCheck.hs
+++ b/Codec/TPTP/QuickCheck.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE NoMonomorphismRestriction, RecordWildCards
-  , StandaloneDeriving, MultiParamTypeClasses, FunctionalDependencies
+  , StandaloneDeriving
   , TypeSynonymInstances, FlexibleInstances, FlexibleContexts
   , UndecidableInstances, DeriveDataTypeable, GeneralizedNewtypeDeriving
   , OverlappingInstances, RankNTypes, PatternGuards
diff --git a/Lexer.x b/Lexer.x
--- a/Lexer.x
+++ b/Lexer.x
@@ -1,4 +1,11 @@
 {
+{-# OPTIONS -fno-warn-missing-signatures #-}
+{-# OPTIONS -fno-warn-unused-binds #-}
+{-# OPTIONS -fno-warn-unused-matches #-}
+{-# OPTIONS -fno-warn-name-shadowing #-}
+{-# OPTIONS -fno-warn-incomplete-patterns #-}
+{-# OPTIONS -fno-warn-lazy-unlifted-bindings #-}
+
 module Lexer where
 import Data.Ratio
 }
diff --git a/MACROS.h b/MACROS.h
--- a/MACROS.h
+++ b/MACROS.h
@@ -1,8 +1,7 @@
 #ifndef __MACROS_H
 
 #define POINTED_FORMULA(c) \
-	(Pointed (Formula0 (T c) (F c)) (c (Formula0 (T c) (F c))))
+	(Pointed c)
 #define POINTED_TERM(c) \
-	(Pointed (Term0 (T c)) (c (Term0 (T c))))
-
+	(Pointed c)
 #endif
diff --git a/Util.hs b/Util.hs
--- a/Util.hs
+++ b/Util.hs
@@ -4,9 +4,10 @@
 
 import Data.Typeable
 
-#if MIN_VERSION_base(4,4,0)
-
-#else
+#ifndef MIN_VERSION_base
+#define MIN_VERSION_base(X,Y,Z) 1
+#endif
+#if ! MIN_VERSION_base(4,4,0)
 mkTyCon3 _ m t = mkTyCon $ m++"."++t
 #endif
 
diff --git a/dist/build/Lexer.hs b/dist/build/Lexer.hs
--- a/dist/build/Lexer.hs
+++ b/dist/build/Lexer.hs
@@ -1,6 +1,13 @@
 {-# LANGUAGE CPP,MagicHash #-}
 {-# LINE 1 "Lexer.x" #-}
 
+{-# OPTIONS -fno-warn-missing-signatures #-}
+{-# OPTIONS -fno-warn-unused-binds #-}
+{-# OPTIONS -fno-warn-unused-matches #-}
+{-# OPTIONS -fno-warn-name-shadowing #-}
+{-# OPTIONS -fno-warn-incomplete-patterns #-}
+{-# OPTIONS -fno-warn-lazy-unlifted-bindings #-}
+
 module Lexer where
 import Data.Ratio
 
@@ -181,7 +188,7 @@
 alex_deflt = AlexA# "\xff\xff\xff\xff\x27\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x15\x00\x15\x00\xff\xff\x17\x00\x17\x00\x19\x00\x19\x00\x1d\x00\x1d\x00\x23\x00\x23\x00\x26\x00\x26\x00\x27\x00\x27\x00\x27\x00\x28\x00\x28\x00\x2e\x00\xff\xff\x2e\x00\x2e\x00\x03\x00\x03\x00\x03\x00\x27\x00\x31\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x3e\x00\x3e\x00\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
 
 alex_accept = listArray (0::Int,80) [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAccSkip)],[(AlexAcc (alex_action_1))],[(AlexAcc (alex_action_2))],[(AlexAcc (alex_action_3))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_11))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_22))]]
-{-# LINE 64 "Lexer.x" #-}
+{-# LINE 71 "Lexer.x" #-}
 
 -- Each action has type :: String -> Token
 
diff --git a/logic-TPTP.cabal b/logic-TPTP.cabal
--- a/logic-TPTP.cabal
+++ b/logic-TPTP.cabal
@@ -1,5 +1,5 @@
 name: logic-TPTP    
-version: 0.3.0.2
+version: 0.4.0.0
 cabal-version: >= 1.6
 build-type: Simple
 license: GPL
@@ -61,8 +61,8 @@
                    , containers
                    , ansi-wl-pprint
                    , QuickCheck >= 2
-                   , utf8-prelude
                    , mtl
+                   , pointed
  
  exposed-modules:   Codec.TPTP.Import
                   , Codec.TPTP.Base
diff --git a/testing/ParseRandom.hs b/testing/ParseRandom.hs
--- a/testing/ParseRandom.hs
+++ b/testing/ParseRandom.hs
@@ -24,11 +24,8 @@
 import qualified Data.ByteString as B
 import Data.Function
 import System.Process
-import System.UTF8IO
 import Control.Arrow
 import Debug.Trace
-import Prelude()
-import UTF8Prelude hiding(catch)
 import System.SimpleArgs
 import Data.Generics
 import Test.QuickCheck
diff --git a/testing/PrettyPrintFile.hs b/testing/PrettyPrintFile.hs
--- a/testing/PrettyPrintFile.hs
+++ b/testing/PrettyPrintFile.hs
@@ -24,11 +24,9 @@
 import qualified Data.ByteString as B
 import Data.Function
 import System.Process
-import System.UTF8IO
+import System.IO
 import Control.Arrow
 import Debug.Trace
-import Prelude()
-import UTF8Prelude hiding(catch)
 import System.SimpleArgs
 import Data.Generics
 import Test.QuickCheck
diff --git a/testing/TestImportExportImportFile.hs b/testing/TestImportExportImportFile.hs
--- a/testing/TestImportExportImportFile.hs
+++ b/testing/TestImportExportImportFile.hs
@@ -6,9 +6,7 @@
 import Data.Maybe
 import Data.List as L
 import Data.Function
-import System.UTF8IO
-import Prelude()
-import UTF8Prelude hiding(catch)
+import System.IO
 import System.SimpleArgs
 import Data.Monoid
 import Text.PrettyPrint.ANSI.Leijen
diff --git a/testing/TestImportExportRandom.hs b/testing/TestImportExportRandom.hs
--- a/testing/TestImportExportRandom.hs
+++ b/testing/TestImportExportRandom.hs
@@ -3,9 +3,7 @@
 module TestImportExportRandom where
 
 import Data.Function
-import System.UTF8IO
-import Prelude()
-import UTF8Prelude hiding(catch)
+import System.IO
 import Test.QuickCheck
 import Common
 import Data.Functor.Identity
