diff --git a/Data/SearchEngine/DocIdSet.hs b/Data/SearchEngine/DocIdSet.hs
--- a/Data/SearchEngine/DocIdSet.hs
+++ b/Data/SearchEngine/DocIdSet.hs
@@ -1,6 +1,7 @@
-{-# LANGUAGE BangPatterns, GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE BangPatterns, GeneralizedNewtypeDeriving, MultiParamTypeClasses,
+             TypeFamilies #-}
 module Data.SearchEngine.DocIdSet (
-    DocId(..),
+    DocId(DocId),
     DocIdSet(..),
     null,
     size,
@@ -19,10 +20,10 @@
 import Data.Word
 import qualified Data.Vector.Unboxed         as Vec
 import qualified Data.Vector.Unboxed.Mutable as MVec
-import qualified Data.Vector.Generic.Base    as VecGen
-import qualified Data.Vector.Unboxed.Base    as VecBase
-import qualified Data.Vector.Generic.Mutable as VecMut
+import qualified Data.Vector.Generic         as GVec
+import qualified Data.Vector.Generic.Mutable as GMVec
 import Control.Monad.ST
+import Control.Monad (liftM)
 import qualified Data.Set as Set
 import Data.List (foldl', sortBy)
 import Data.Function (on)
@@ -30,10 +31,8 @@
 import Prelude hiding (null)
 
 
-newtype DocId = DocId Word32
-  deriving (Eq, Ord, Show, Enum, Bounded, Vec.Unbox,
-            VecGen.Vector VecBase.Vector,
-            VecMut.MVector VecBase.MVector)
+newtype DocId = DocId { unDocId :: Word32 }
+  deriving (Eq, Ord, Show, Enum, Bounded)
 
 newtype DocIdSet = DocIdSet (Vec.Vector DocId)
   deriving (Eq, Show)
@@ -147,4 +146,57 @@
                           EQ -> do MVec.write out i x
                                    go (Vec.tail xs) (Vec.tail ys) (i+1)
                           LT ->    go (Vec.tail xs)           ys   i
+
+------------------------------------------------------------------------------
+-- verbose Unbox instances
+--
+
+instance MVec.Unbox DocId
+
+newtype instance MVec.MVector s DocId = MV_DocId (MVec.MVector s Word32)
+
+instance GMVec.MVector MVec.MVector DocId where
+    basicLength          (MV_DocId v) = GMVec.basicLength v
+    basicUnsafeSlice i l (MV_DocId v) = MV_DocId (GMVec.basicUnsafeSlice i l v)
+    basicUnsafeNew     l              = MV_DocId `liftM` GMVec.basicUnsafeNew l
+    basicUnsafeReplicate l x          = MV_DocId `liftM` GMVec.basicUnsafeReplicate l (unDocId x)
+    basicUnsafeRead  (MV_DocId v) i   = DocId `liftM`    GMVec.basicUnsafeRead v i
+    basicUnsafeWrite (MV_DocId v) i x = GMVec.basicUnsafeWrite v i (unDocId x)
+    basicClear       (MV_DocId v)     = GMVec.basicClear v
+    basicSet         (MV_DocId v) x   = GMVec.basicSet v (unDocId x)
+    basicUnsafeGrow  (MV_DocId v) l   = MV_DocId `liftM` GMVec.basicUnsafeGrow v l
+    basicUnsafeCopy  (MV_DocId v) (MV_DocId v') = GMVec.basicUnsafeCopy v v'
+    basicUnsafeMove  (MV_DocId v) (MV_DocId v') = GMVec.basicUnsafeMove v v'
+    basicOverlaps    (MV_DocId v) (MV_DocId v') = GMVec.basicOverlaps   v v'
+    {-# INLINE basicLength #-}
+    {-# INLINE basicUnsafeSlice #-}
+    {-# INLINE basicOverlaps #-}
+    {-# INLINE basicUnsafeNew #-}
+    {-# INLINE basicUnsafeReplicate #-}
+    {-# INLINE basicUnsafeRead #-}
+    {-# INLINE basicUnsafeWrite #-}
+    {-# INLINE basicClear #-}
+    {-# INLINE basicSet #-}
+    {-# INLINE basicUnsafeCopy #-}
+    {-# INLINE basicUnsafeMove #-}
+    {-# INLINE basicUnsafeGrow #-}
+
+newtype instance Vec.Vector DocId = V_DocId (Vec.Vector Word32)
+
+instance GVec.Vector Vec.Vector DocId where
+    basicUnsafeFreeze (MV_DocId mv)  = V_DocId  `liftM` GVec.basicUnsafeFreeze mv
+    basicUnsafeThaw   (V_DocId  v)   = MV_DocId `liftM` GVec.basicUnsafeThaw v
+    basicLength       (V_DocId  v)   = GVec.basicLength v
+    basicUnsafeSlice i l (V_DocId v) = V_DocId (GVec.basicUnsafeSlice i l v)
+    basicUnsafeIndexM (V_DocId  v) i = DocId `liftM` GVec.basicUnsafeIndexM v i
+    basicUnsafeCopy   (MV_DocId mv)
+                      (V_DocId  v)   = GVec.basicUnsafeCopy mv v
+    elemseq           (V_DocId  v) x = GVec.elemseq v (unDocId x)
+    {-# INLINE basicUnsafeFreeze #-}
+    {-# INLINE basicUnsafeThaw #-}
+    {-# INLINE basicLength #-}
+    {-# INLINE basicUnsafeSlice #-}
+    {-# INLINE basicUnsafeIndexM #-}
+    {-# INLINE basicUnsafeCopy #-}
+    {-# INLINE elemseq #-}
 
diff --git a/Data/SearchEngine/TermBag.hs b/Data/SearchEngine/TermBag.hs
--- a/Data/SearchEngine/TermBag.hs
+++ b/Data/SearchEngine/TermBag.hs
@@ -1,6 +1,7 @@
-{-# LANGUAGE BangPatterns, GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE BangPatterns, GeneralizedNewtypeDeriving, MultiParamTypeClasses,
+             TypeFamilies #-}
 module Data.SearchEngine.TermBag (
-    TermId(..), TermCount,
+    TermId(TermId), TermCount,
     TermBag,
     size,
     fromList,
@@ -13,20 +14,18 @@
 
 import qualified Data.Vector.Unboxed         as Vec
 import qualified Data.Vector.Unboxed.Mutable as MVec
-import qualified Data.Vector.Generic.Base    as VecGen
-import qualified Data.Vector.Unboxed.Base    as VecBase
-import qualified Data.Vector.Generic.Mutable as VecMut
+import qualified Data.Vector.Generic         as GVec
+import qualified Data.Vector.Generic.Mutable as GMVec
 import Control.Monad.ST
+import Control.Monad (liftM)
 import qualified Data.Map as Map
 import Data.Word (Word32, Word8)
 import Data.Bits
 import Data.List (sortBy, foldl')
 import Data.Function (on)
 
-newtype TermId = TermId Word32
-  deriving (Eq, Ord, Show, Enum,
-            Vec.Unbox, VecGen.Vector VecBase.Vector,
-            VecMut.MVector VecBase.MVector)
+newtype TermId = TermId { unTermId :: Word32 }
+  deriving (Eq, Ord, Show, Enum)
 
 instance Bounded TermId where
   minBound = TermId 0
@@ -207,3 +206,57 @@
                                    go (Vec.tail xs) (Vec.tail ys) (i+1)
                           LT -> do MVec.write out i x
                                    go (Vec.tail xs)           ys  (i+1)
+
+------------------------------------------------------------------------------
+-- verbose Unbox instances
+--
+
+instance MVec.Unbox TermId
+
+newtype instance MVec.MVector s TermId = MV_TermId (MVec.MVector s Word32)
+
+instance GMVec.MVector MVec.MVector TermId where
+    basicLength          (MV_TermId v) = GMVec.basicLength v
+    basicUnsafeSlice i l (MV_TermId v) = MV_TermId (GMVec.basicUnsafeSlice i l v)
+    basicUnsafeNew     l              = MV_TermId `liftM` GMVec.basicUnsafeNew l
+    basicUnsafeReplicate l x          = MV_TermId `liftM` GMVec.basicUnsafeReplicate l (unTermId x)
+    basicUnsafeRead  (MV_TermId v) i   = TermId `liftM`    GMVec.basicUnsafeRead v i
+    basicUnsafeWrite (MV_TermId v) i x = GMVec.basicUnsafeWrite v i (unTermId x)
+    basicClear       (MV_TermId v)     = GMVec.basicClear v
+    basicSet         (MV_TermId v) x   = GMVec.basicSet v (unTermId x)
+    basicUnsafeGrow  (MV_TermId v) l   = MV_TermId `liftM` GMVec.basicUnsafeGrow v l
+    basicUnsafeCopy  (MV_TermId v) (MV_TermId v') = GMVec.basicUnsafeCopy v v'
+    basicUnsafeMove  (MV_TermId v) (MV_TermId v') = GMVec.basicUnsafeMove v v'
+    basicOverlaps    (MV_TermId v) (MV_TermId v') = GMVec.basicOverlaps   v v'
+    {-# INLINE basicLength #-}
+    {-# INLINE basicUnsafeSlice #-}
+    {-# INLINE basicOverlaps #-}
+    {-# INLINE basicUnsafeNew #-}
+    {-# INLINE basicUnsafeReplicate #-}
+    {-# INLINE basicUnsafeRead #-}
+    {-# INLINE basicUnsafeWrite #-}
+    {-# INLINE basicClear #-}
+    {-# INLINE basicSet #-}
+    {-# INLINE basicUnsafeCopy #-}
+    {-# INLINE basicUnsafeMove #-}
+    {-# INLINE basicUnsafeGrow #-}
+
+newtype instance Vec.Vector TermId = V_TermId (Vec.Vector Word32)
+
+instance GVec.Vector Vec.Vector TermId where
+    basicUnsafeFreeze (MV_TermId mv)  = V_TermId  `liftM` GVec.basicUnsafeFreeze mv
+    basicUnsafeThaw   (V_TermId  v)   = MV_TermId `liftM` GVec.basicUnsafeThaw v
+    basicLength       (V_TermId  v)   = GVec.basicLength v
+    basicUnsafeSlice i l (V_TermId v) = V_TermId (GVec.basicUnsafeSlice i l v)
+    basicUnsafeIndexM (V_TermId  v) i = TermId `liftM` GVec.basicUnsafeIndexM v i
+    basicUnsafeCopy   (MV_TermId mv)
+                      (V_TermId  v)   = GVec.basicUnsafeCopy mv v
+    elemseq           (V_TermId  v) x = GVec.elemseq v (unTermId x)
+    {-# INLINE basicUnsafeFreeze #-}
+    {-# INLINE basicUnsafeThaw #-}
+    {-# INLINE basicLength #-}
+    {-# INLINE basicUnsafeSlice #-}
+    {-# INLINE basicUnsafeIndexM #-}
+    {-# INLINE basicUnsafeCopy #-}
+    {-# INLINE elemseq #-}
+
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+0.2.1.3 Duncan Coutts <duncan@well-typed.com> May 2015
+        * Compatibility with GHC 7.10 (no API changes)
+
+0.2.1.2 Adam Gundry <adam@well-typed.com> July 2014
+        * Compatibility with GHC 7.8 (no API changes)
+
 0.2.1.1 Duncan Coutts <duncan@well-typed.com> May 2014
         * Fix for NaN scores with a doc field that is empty for all docs
         * Add instance Show NoFeatures
diff --git a/full-text-search.cabal b/full-text-search.cabal
--- a/full-text-search.cabal
+++ b/full-text-search.cabal
@@ -1,5 +1,5 @@
 name:                full-text-search
-version:             0.2.1.1
+version:             0.2.1.3
 synopsis:            In-memory full text search engine
 description:         An in-memory full text search engine library. It lets you
                      run full-text queries on a collection of your documents.
@@ -77,11 +77,11 @@
                        RecordWildCards,
                        GeneralizedNewtypeDeriving,
                        ScopedTypeVariables
-  build-depends:       base       >=4.5  && <4.7,
-                       array      >=0.4  && <0.5,
+  build-depends:       base       >=4.5  && <4.9,
+                       array      >=0.4  && <0.6,
                        vector     >=0.10 && <0.11,
                        containers >=0.4  && <0.6,
-                       text       >=0.11 && <1.2
+                       text       >=0.11 && <1.3
   default-language:    Haskell2010
   ghc-options:         -Wall -funbox-strict-fields
 
