diff --git a/Blaze/ByteString/Builder.hs b/Blaze/ByteString/Builder.hs
--- a/Blaze/ByteString/Builder.hs
+++ b/Blaze/ByteString/Builder.hs
@@ -120,15 +120,27 @@
 unsafeDupablePerformIO = unsafePerformIO
 #endif
 
+withBS :: S.ByteString -> (ForeignPtr Word8 -> Int -> Int -> a) -> a
+#if MIN_VERSION_bytestring(0,11,0)
+withBS (S.BS fptr len) f = f fptr 0 len
+#else
+withBS (S.PS fptr offset len) f = f fptr offset len
+#endif
 
+mkBS :: ForeignPtr Word8 -> Int -> S.ByteString
+#if MIN_VERSION_bytestring(0,11,0)
+mkBS fptr len = S.BS fptr len
+#else
+mkBS fptr len = S.PS fptr 0 len
+#endif
 
 -- | Pack the chunks of a lazy bytestring into a single strict bytestring.
 packChunks :: L.ByteString -> S.ByteString
 packChunks lbs = do
     S.unsafeCreate (fromIntegral $ L.length lbs) (copyChunks lbs)
   where
-    copyChunks !L.Empty                         !_pf = return ()
-    copyChunks !(L.Chunk (S.PS fpbuf o l) lbs') !pf  = do
+    copyChunks !L.Empty           !_pf = return ()
+    copyChunks !(L.Chunk bs lbs') !pf  = withBS bs $ \fpbuf o l -> do
         withForeignPtr fpbuf $ \pbuf ->
             copyBytes pf (pbuf `plusPtr` o) l
         copyChunks lbs' (pf `plusPtr` l)
@@ -188,15 +200,15 @@
       let !ptr = Unsafe.unsafeForeignPtrToPtr fp
       (bytes, next) <- writer ptr size
       case next of
-        B.Done -> io $! S.PS fp 0 bytes
+        B.Done -> io $! mkBS fp bytes
         B.More req writer' -> do
-           io $! S.PS fp 0 bytes
+           io $! mkBS fp bytes
            let !size' = max bufSize req
            S.mallocByteString size' >>= getBuffer writer' size'
         B.Chunk bs' writer' -> do
            if bytes > 0
              then do
-               io $! S.PS fp 0 bytes
+               io $! mkBS fp bytes
                unless (S.null bs') (io bs')
                S.mallocByteString bufSize >>= getBuffer writer' bufSize
              else do
diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,11 @@
+* 0.4.2.1
+  - Bump cabal file to Cabal >= 1.10
+
+* 0.4.2.0
+  - Make semigroup instances unconditional
+  - Support bytestring-0.11
+  - Support semigroups-0.19
+
 * 0.4.1.0
   - Gain compatibility with the Semigroup/Monoid proposal
   - Add Word8 HTML escaping builders
diff --git a/blaze-builder.cabal b/blaze-builder.cabal
--- a/blaze-builder.cabal
+++ b/blaze-builder.cabal
@@ -1,5 +1,5 @@
 Name:                blaze-builder
-Version:             0.4.1.0
+Version:             0.4.2.1
 Synopsis:            Efficient buffered output.
 
 Description:
@@ -34,7 +34,7 @@
 
 Category:            Data
 Build-type:          Simple
-Cabal-version:       >= 1.8
+Cabal-version:       >= 1.10
 
 Extra-source-files:
                      Makefile
@@ -55,6 +55,7 @@
 
 Library
   ghc-options:       -Wall
+  default-language:  Haskell98
 
   exposed-modules:   Blaze.ByteString.Builder
                      Blaze.ByteString.Builder.Int
@@ -80,15 +81,14 @@
      build-depends:  bytestring >= 0.10.4 && < 1.0
 
   if impl(ghc < 8.0)
-     build-depends: semigroups >= 0.16 && < 0.19
+     build-depends: semigroups >= 0.16 && < 0.20
 
 test-suite test
-  type:           exitcode-stdio-1.0
-
-  hs-source-dirs: tests
-  main-is:        Tests.hs
-
-  ghc-options: -Wall -fno-warn-orphans
+  type:             exitcode-stdio-1.0
+  hs-source-dirs:   tests
+  main-is:          Tests.hs
+  default-language: Haskell98
+  ghc-options:      -Wall -fno-warn-orphans
 
   build-depends: base
                , blaze-builder
