diff --git a/Data/ByteString/FastBuilder/Internal.hs b/Data/ByteString/FastBuilder/Internal.hs
--- a/Data/ByteString/FastBuilder/Internal.hs
+++ b/Data/ByteString/FastBuilder/Internal.hs
@@ -110,7 +110,10 @@
 instance Monoid Builder where
   mempty = Builder $ \_ bs -> bs
   {-# INLINE mempty #-}
-  mappend (Builder a) (Builder b) = oneShotBuilder $
+  mappend (Builder a) (Builder b) = rebuild $
+      -- This rebuild means we basically give up on write/write rewrites.
+      -- However this can make a big difference in some cases, and seems
+      -- important enough. TODO: get rid of it once GHC 8.0 is out.
     Builder $ \dex bs -> b dex (a dex bs)
   {-# INLINE mappend #-}
   mconcat xs = foldr mappend mempty xs
diff --git a/benchmarks/aeson/HashMapExts.hs b/benchmarks/aeson/HashMapExts.hs
--- a/benchmarks/aeson/HashMapExts.hs
+++ b/benchmarks/aeson/HashMapExts.hs
@@ -4,28 +4,27 @@
 {-# LANGUAGE UnboxedTuples #-}
 module HashMapExts where
 
-import qualified Data.HashMap.Strict as H
+import Data.HashMap.Strict (HashMap)
 import Data.Monoid
 import GHC.Exts (Array#, sizeofArray#, indexArray#, Int(..))
-import Unsafe.TrueName (quasiName)
-
-import HashMapNames
+import Unsafe.TrueName (truename)
 
-foldMapWithKey :: (Monoid m) => (k -> a -> m) -> H.HashMap k a -> m
+foldMapWithKey :: (Monoid m) => (k -> a -> m) -> HashMap k a -> m
 foldMapWithKey f = go
   where
     go hm = case hm of
-      [quasiName|Empty ''H.HashMap|] -> mempty
-      [quasiName|BitmapIndexed ''H.HashMap _ ary|] -> foldMapArray go ary
-      [quasiName|Full ''H.HashMap ary|] -> foldMapArray go ary
-      [quasiName|Collision ''H.HashMap _ ary|] -> foldMapArray leaf ary
-      [quasiName|Leaf ''H.HashMap _ l|] -> leaf l
+      [truename| ''HashMap Empty |] -> mempty
+      [truename| ''HashMap BitmapIndexed | _ ary |] -> foldMapArray go ary
+      [truename| ''HashMap Full | ary |] -> foldMapArray go ary
+      [truename| ''HashMap Collision | _ ary |] -> foldMapArray leaf ary
+      [truename| ''HashMap Leaf | _ l |] -> leaf l
 
-    leaf $(lPat "k" "v")  = f k v
+    leaf [truename| ''HashMap Leaf Leaf L | k v|]  = f k v
 {-# INLINE foldMapWithKey #-}
 
-foldMapArray :: (Monoid m) => (a -> m) -> $(arrayType) a -> m
-foldMapArray f $(arrayPat "arr") = foldMapArray' f arr
+foldMapArray :: (Monoid m) =>
+    (a -> m) -> [truename| ''HashMap Full Array |] a -> m
+foldMapArray f [truename| ''HashMap Full Array Array | a |] = foldMapArray' f a
 
 foldMapArray' :: (Monoid m) => (a -> m) -> Array# a -> m
 foldMapArray' f arr = go 0
diff --git a/benchmarks/aeson/HashMapNames.hs b/benchmarks/aeson/HashMapNames.hs
deleted file mode 100644
--- a/benchmarks/aeson/HashMapNames.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-module HashMapNames where
-
-import qualified Data.HashMap.Strict as H
-import Language.Haskell.TH
-import Unsafe.TrueName (trueName)
-
-lPat :: String -> String -> Q Pat
-lPat a b = do
-  leafConName <- trueName "Leaf" ''H.HashMap
-  leafTyName <- trueName "Leaf" leafConName
-  lName <- trueName "L" leafTyName
-  conP lName [varP (mkName a), varP (mkName b)]
-
-arrayTypeName :: Q Name
-arrayTypeName = do
-  fullConName <- trueName "Full" ''H.HashMap
-  trueName "Array" fullConName
-
-arrayType :: Q Type
-arrayType = conT =<< arrayTypeName
-
-arrayPat :: String -> Q Pat
-arrayPat a = do
-  arrayTyName <- arrayTypeName
-  arrayConName <- trueName "Array" arrayTyName
-  conP arrayConName [varP (mkName a)]
diff --git a/fast-builder.cabal b/fast-builder.cabal
--- a/fast-builder.cabal
+++ b/fast-builder.cabal
@@ -1,5 +1,5 @@
 name:                fast-builder
-version:             0.0.0.2
+version:             0.0.0.3
 synopsis:            Fast ByteString Builder
 description:         An efficient implementation of ByteString builder. It should be faster than
                      the standard implementation in most cases.
@@ -15,6 +15,7 @@
 build-type:          Simple
 -- extra-source-files:  
 cabal-version:       >=1.10
+tested-with:         GHC >= 7.10.1 && < 8
 
 library
   exposed-modules:     Data.ByteString.FastBuilder,
@@ -31,8 +32,10 @@
   type:                exitcode-stdio-1.0
   main-is:             main.hs
   hs-source-dirs:      benchmarks/aeson
-  other-modules:       Fast, Bstr, HashMapExts, HashMapNames
-  build-depends:       base, fast-builder, aeson, criterion, bytestring, scientific, text, vector, deepseq, unordered-containers, ghc-prim, true-name, template-haskell
+  other-modules:       Fast, Bstr, HashMapExts
+  build-depends:       base, fast-builder, aeson, criterion, bytestring,
+    scientific, text, vector, deepseq, unordered-containers, ghc-prim,
+    template-haskell, true-name >= 0.1.0.0
   ghc-options:         -fsimpl-tick-factor=120
   ghc-options:         -Wall -threaded -g -rtsopts
 
