diff --git a/Data/TrieMap/OrdMap.hs b/Data/TrieMap/OrdMap.hs
--- a/Data/TrieMap/OrdMap.hs
+++ b/Data/TrieMap/OrdMap.hs
@@ -38,9 +38,9 @@
 deriving instance ImmoralCast a (Elem a)
 
 instance Sized a => Sized (Node k a) where
-  getSize# m = unbox $ case m of
+  getSize# m = unbox (case m of
     Tip	-> 0
-    Bin _ a l r	-> getSize a + getSize l + getSize r
+    Bin _ a l r	-> getSize a + getSize l + getSize r)
 
 instance Sized (SNode k a) where
   getSize# SNode{sz} = unbox sz
diff --git a/Data/TrieMap/RadixTrie/Edge.hs b/Data/TrieMap/RadixTrie/Edge.hs
--- a/Data/TrieMap/RadixTrie/Edge.hs
+++ b/Data/TrieMap/RadixTrie/Edge.hs
diff --git a/Data/TrieMap/Representation/Instances.hs b/Data/TrieMap/Representation/Instances.hs
--- a/Data/TrieMap/Representation/Instances.hs
+++ b/Data/TrieMap/Representation/Instances.hs
@@ -18,7 +18,6 @@
 import Data.TrieMap.Representation.Instances.Basic ()
 import Data.TrieMap.Representation.Instances.ByteString ()
 import Data.TrieMap.Representation.Instances.Vectors ()
-import Data.TrieMap.Representation.Instances.Foreign ()
 import Data.TrieMap.Representation.TH
 
 #define DefList(ty) \
diff --git a/Data/TrieMap/Representation/Instances/Foreign.hs b/Data/TrieMap/Representation/Instances/Foreign.hs
deleted file mode 100644
--- a/Data/TrieMap/Representation/Instances/Foreign.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-{-# LANGUAGE TemplateHaskell, TypeFamilies, UndecidableInstances #-}
-module Data.TrieMap.Representation.Instances.Foreign () where
-
-import Foreign.C.Types
-import Data.TrieMap.Representation.Instances.Prim ()
-import Data.TrieMap.Representation.Instances.Basic ()
-import Data.TrieMap.Representation.TH
-
-genRepr ''CChar
-genRepr ''CSChar
-genRepr ''CUChar
-genRepr ''CShort
-genRepr ''CUShort
-genRepr ''CInt
-genRepr ''CUInt
-genRepr ''CLong
-genRepr ''CULong
-genRepr ''CPtrdiff
-genRepr ''CSize
-genRepr ''CWchar
-genRepr ''CSigAtomic
-genRepr ''CLLong
-genRepr ''CULLong
-genRepr ''CClock
-genRepr ''CTime
-genRepr ''CFloat
-genRepr ''CDouble
diff --git a/Data/TrieMap/Representation/TH/ReprMonad.hs b/Data/TrieMap/Representation/TH/ReprMonad.hs
--- a/Data/TrieMap/Representation/TH/ReprMonad.hs
+++ b/Data/TrieMap/Representation/TH/ReprMonad.hs
@@ -11,6 +11,7 @@
 import Data.TrieMap.Representation.Class
 import Data.TrieMap.Representation.TH.Utils
 
+import Control.Applicative
 import Control.Monad
 import Language.Haskell.TH.Syntax
 import Language.Haskell.TH.ExpandSyns
@@ -34,19 +35,25 @@
 instance Functor ReprMonad where
 	fmap = liftM
 
+instance Applicative ReprMonad where
+  pure = return
+  (<*>) = ap
+
 liftQuasi :: Q a -> ReprMonad a
 liftQuasi q = ReprMonad $ \ knowns _ -> do
     a <- q
     return ([], knowns, a)
 
 instance Quasi ReprMonad where
-	qNewName = liftQuasi . qNewName
-	qReport b str = liftQuasi (qReport b str)
-	qRecover m k = ReprMonad $ \ knowns breaks -> qRecover (runReprMonad m knowns breaks) (runReprMonad k knowns breaks)
-	qReify = liftQuasi . qReify
-	qClassInstances name typs =  liftQuasi (qClassInstances name typs)
-	qLocation = liftQuasi qLocation
-	qRunIO = liftQuasi . qRunIO
+  qNewName = liftQuasi . qNewName
+  qReport b str = liftQuasi (qReport b str)
+  qRecover m k = ReprMonad $ \ knowns breaks -> qRecover (runReprMonad m knowns breaks) (runReprMonad k knowns breaks)
+  qLookupName b str = liftQuasi (qLookupName b str)
+  qReify = liftQuasi . qReify
+  qReifyInstances name typs = liftQuasi (qReifyInstances name typs)
+  qLocation = liftQuasi qLocation
+  qRunIO = liftQuasi . qRunIO
+  qAddDependentFile = liftQuasi . qAddDependentFile
 
 insNub :: Eq a => a -> [a] -> [a]
 insNub x ys0@(y:ys)
@@ -77,6 +84,6 @@
 execReprMonad m = do
 	ClassI _ instances <- reify ''Repr
 	let instanceHeads = [(tyConName, (tyArgs, ConT ''Rep `AppT` compose tyConName tyArgs))
-		| ClassInstance{ci_tys = [decompose' -> Just (tyConName, tyArgs)]} <- instances]
+		| (InstanceD _ (decompose' -> Just (tyConName, tyArgs)) _) <- instances]
 	(decs, _, _) <- runReprMonad m instanceHeads []
 	return decs
diff --git a/Data/TrieMap/WordMap.hs b/Data/TrieMap/WordMap.hs
--- a/Data/TrieMap/WordMap.hs
+++ b/Data/TrieMap/WordMap.hs
@@ -41,10 +41,10 @@
   getSize# SNode{sz} = unbox sz
 
 instance Sized a => Sized (Node a) where
-  getSize# t = unbox $ case t of
+  getSize# t = unbox (case t of
     Nil		-> 0
     Tip _ a	-> getSize a
-    Bin _ _ l r	-> getSize l + getSize r
+    Bin _ _ l r	-> getSize l + getSize r)
 
 {-# INLINE sNode #-}
 sNode :: Sized a => Node a -> SNode a
diff --git a/TrieMap.cabal b/TrieMap.cabal
--- a/TrieMap.cabal
+++ b/TrieMap.cabal
@@ -1,5 +1,5 @@
 name:		     TrieMap
-version:             4.0.1
+version:             4.1.0
 cabal-version:       >= 1.6
 tested-with:	     GHC
 category:            Algorithms
@@ -29,7 +29,7 @@
 }
 
 Library{
-build-Depends:    base < 5.0.0.0, containers, template-haskell >= 2.5.0.0, bytestring >= 0.9.1.0, th-expand-syns,
+build-Depends:    base < 5.0.0.0, containers, template-haskell >= 2.7.0.0, bytestring >= 0.9.1.0, th-expand-syns,
                   vector >= 0.6, primitive >= 0.3, unpack-funcs >= 0.1.2, transformers >= 0.2.0.0
 ghc-options:
   -Wall -fno-warn-name-shadowing -fno-warn-orphans -fno-spec-constr-count -fno-spec-constr-threshold
@@ -63,7 +63,6 @@
   Data.TrieMap.Representation.Instances,
   Data.TrieMap.Representation.Instances.Basic,
   Data.TrieMap.Representation.Instances.Prim,
-  Data.TrieMap.Representation.Instances.Foreign,
   Data.TrieMap.Representation.Instances.Vectors,
   Data.TrieMap.Representation.Instances.ByteString
   Data.TrieMap.WordMap,
