diff --git a/bson-mapping.cabal b/bson-mapping.cabal
--- a/bson-mapping.cabal
+++ b/bson-mapping.cabal
@@ -1,5 +1,5 @@
 Name:               bson-mapping
-Version:            0.1.5.0
+Version:            0.1.5.1
 License:            OtherLicense
 License-File:       LICENSE
 Author:             Francesco Mazzoli <f@mazzo.li>
@@ -19,10 +19,10 @@
 
 Library
   Build-Depends:      base >= 4 && < 5,
-                      template-haskell >= 2.5,
+                      template-haskell >= 2.11.0.0,
                       th-lift >= 0.5.3,
-                      bson >= 0.2,
-                      text >= 1.1
+                      bson >= 0.3,
+                      text == 1.2.*
 
   hs-source-dirs:     src
 
diff --git a/src/Data/Bson/Mapping.hs b/src/Data/Bson/Mapping.hs
--- a/src/Data/Bson/Mapping.hs
+++ b/src/Data/Bson/Mapping.hs
@@ -1,4 +1,5 @@
 {-# Language TemplateHaskell #-}
+{-# LANGUAGE OverloadedStrings #-}
 
 {- |
 
@@ -17,7 +18,7 @@
 >
 > data Post = Post { time :: UTCTime
 >                  , author :: String
->                  , content :: String 
+>                  , content :: String
 >                  , votes :: Int
 >                  }
 >           deriving (Show, Read, Eq, Ord, Typeable)
@@ -35,7 +36,7 @@
 
 module Data.Bson.Mapping
        ( Bson (..)
-       , deriveBson  
+       , deriveBson
        , selectFields
        , getLabel
        , getConsDoc
@@ -47,7 +48,7 @@
 
 import Data.Bson
 import Data.Data               (Typeable)
-import Data.Text (append, cons)
+import Data.Text (Text, append, cons, pack)
 
 import Language.Haskell.TH
 import Language.Haskell.TH.Lift ()
@@ -60,10 +61,10 @@
 deriveBson :: Name -> Q [Dec]
 deriveBson type' = do
   (cx, conss, keys) <- bsonType
-  
+
   -- Each type in the data type must be an instance of val
   let context = [ classP ''Val [varT key] | key <- keys ] ++ map return cx
-  
+
   -- Generate the functions for the Bson instance
   let fs = [ funD 'toBson (map deriveToBson conss)
            , funD 'fromBson [clause [] (normalB $ deriveFromBson conss) []]
@@ -72,36 +73,36 @@
 
   -- Generate the Val instance (easy, since a Bson doc is
   -- automatically a Val)
-  doc <- newName "doc"         
+  doc <- newName "doc"
   i' <- instanceD (cxt []) (mkType ''Val [mkType type' (map varT keys)])
         [ funD 'val   [clause [] (normalB $ [| Doc . toBson |]) []]
         , funD 'cast' [ clause [conP 'Doc [varP doc]] (normalB $ [| fromBson $(varE doc) |]) []
                       , clause [[p| _ |]] (normalB $ [| Nothing |]) []
-                      ]          
+                      ]
         ]
-  
+
   return [i, i']
-  
+
   where
 
     -- Check that wha has been provided is a data/newtype declaration
     bsonType = do
       info <- reify type'
       case info of
-        TyConI (DataD cx _ keys conss _)  -> return (cx, conss, map conv keys)
-        TyConI (NewtypeD cx _ keys con _) -> return (cx, [con], map conv keys)
+        TyConI (DataD cx _ keys _ conss _)  -> return (cx, conss, map conv keys)
+        TyConI (NewtypeD cx _ keys _ con _) -> return (cx, [con], map conv keys)
         _ -> inputError
-    
+
     mkType con = foldl appT (conT con)
-    
+
     conv (PlainTV n)    = n
     conv (KindedTV n _) = n
-    
+
     inputError = error $ "deriveBson: Invalid type provided. " ++
                          "The type must be a data type or a newtype. " ++
                          "Currently infix constructors and existential types are not supported."
 
-    
+
     -- deriveToBson generates the clauses that pattern match the
     -- constructors of the data type, and then the function to convert
     -- them to Bson.
@@ -141,13 +142,13 @@
     deriveFromBson conss = do
       con <- newName "con"
       docN <- newName "doc"
-      (SigE _ (ConT strtype)) <- runQ [| "" :: String |]
+      (SigE _ (ConT strtype)) <- runQ [| "" :: Text |]
       let doc = varE docN
       lamE [varP docN] $ doE
         [ bindS (varP con) [| lookup consField $doc |]
         , noBindS $ caseE (sigE (varE con) (conT strtype)) (map (genMatch doc) conss ++ noMatch)
         ]
- 
+
     noMatch = [match [p| _ |] (normalB [| fail "Couldn't find right constructor" |]) []]
 
 
@@ -194,12 +195,12 @@
     genStmts [] _ = return ([], [])
     genStmts (f : fs) doc = do
       fvar <- newName "f"
-      let stmt = bindS (varP fvar) $ [| lookup (nameBase f) $doc |]
+      let stmt = bindS (varP fvar) $ [| lookup (pack (nameBase f)) $doc |]
       (fields, stmts) <- genStmts fs doc
       return $ (return (f, VarE fvar) : fields, stmt : stmts)
 
 
-dataField, consField :: String
+dataField, consField :: Text
 dataField = "_data"
 consField = "_cons"
 
@@ -219,7 +220,7 @@
   lamE [varP d] (return e)
   where
     gf _ []        = [| [] |]
-    gf d (n : ns') = [| ($(getLabel n) =: $(varE n) $(varE d)) : $(gf d ns') |]
+    gf d (n : ns') = [| ((pack $(getLabel n)) =: $(varE n) $(varE d)) : $(gf d ns') |]
 
 {-|
 
