diff --git a/Data/Attoparsec/ByteString/Buffer.hs b/Data/Attoparsec/ByteString/Buffer.hs
--- a/Data/Attoparsec/ByteString/Buffer.hs
+++ b/Data/Attoparsec/ByteString/Buffer.hs
@@ -56,6 +56,7 @@
 import Control.Exception (assert)
 import Data.ByteString.Internal (ByteString(..), memcpy, nullForeignPtr)
 import Data.Attoparsec.Internal.Fhthagn (inlinePerformIO)
+import Data.Attoparsec.Internal.Compat
 import Data.List (foldl1')
 import Data.Monoid as Mon (Monoid(..))
 import Data.Semigroup (Semigroup(..))
@@ -82,10 +83,10 @@
 -- copies in the (hopefully) common case of no further input being fed
 -- to us.
 buffer :: ByteString -> Buffer
-buffer (PS fp off len) = Buf fp off len len 0
+buffer bs = withPS bs $ \fp off len -> Buf fp off len len 0
 
 unbuffer :: Buffer -> ByteString
-unbuffer (Buf fp off len _ _) = PS fp off len
+unbuffer (Buf fp off len _ _) = mkPS fp off len
 
 instance Semigroup Buffer where
     (Buf _ _ _ 0 _) <> b                    = b
@@ -102,7 +103,7 @@
 
 pappend :: Buffer -> ByteString -> Buffer
 pappend (Buf _ _ _ 0 _) bs  = buffer bs
-pappend buf (PS fp off len) = append buf fp off len
+pappend buf             bs  = withPS bs $ \fp off len -> append buf fp off len
 
 append :: Buffer -> ForeignPtr a -> Int -> Int -> Buffer
 append (Buf fp0 off0 len0 cap0 gen0) !fp1 !off1 !len1 =
@@ -146,11 +147,11 @@
 substring s l (Buf fp off len _ _) =
   assert (s >= 0 && s <= len) .
   assert (l >= 0 && l <= len-s) $
-  PS fp (off+s) l
+  mkPS fp (off+s) l
 {-# INLINE substring #-}
 
 unsafeDrop :: Int -> Buffer -> ByteString
 unsafeDrop s (Buf fp off len _ _) =
   assert (s >= 0 && s <= len) $
-  PS fp (off+s) (len-s)
+  mkPS fp (off+s) (len-s)
 {-# INLINE unsafeDrop #-}
diff --git a/Data/Attoparsec/ByteString/Internal.hs b/Data/Attoparsec/ByteString/Internal.hs
--- a/Data/Attoparsec/ByteString/Internal.hs
+++ b/Data/Attoparsec/ByteString/Internal.hs
@@ -75,6 +75,7 @@
 import Data.Attoparsec.ByteString.FastSet (charClass, memberWord8)
 import Data.Attoparsec.Combinator ((<?>))
 import Data.Attoparsec.Internal
+import Data.Attoparsec.Internal.Compat
 import Data.Attoparsec.Internal.Fhthagn (inlinePerformIO)
 import Data.Attoparsec.Internal.Types hiding (Parser, Failure, Success)
 import Data.ByteString (ByteString)
@@ -303,7 +304,7 @@
 scan_ f s0 p = go [] s0
  where
   go acc s1 = do
-    let scanner (B.PS fp off len) =
+    let scanner bs = withPS bs $ \fp off len ->
           withForeignPtr fp $ \ptr0 -> do
             let start = ptr0 `plusPtr` off
                 end   = start `plusPtr` len
diff --git a/Data/Attoparsec/Internal/Compat.hs b/Data/Attoparsec/Internal/Compat.hs
new file mode 100644
--- /dev/null
+++ b/Data/Attoparsec/Internal/Compat.hs
@@ -0,0 +1,27 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE MagicHash #-}
+module Data.Attoparsec.Internal.Compat where
+
+import Data.ByteString.Internal (ByteString(..))
+import Data.Word (Word8)
+import Foreign.ForeignPtr (ForeignPtr)
+
+#if MIN_VERSION_bytestring(0,11,0)
+import Data.ByteString.Internal (plusForeignPtr)
+#endif
+
+withPS :: ByteString -> (ForeignPtr Word8 -> Int -> Int -> r) -> r
+#if MIN_VERSION_bytestring(0,11,0)
+withPS (BS fp len)     kont = kont fp 0   len
+#else
+withPS (PS fp off len) kont = kont fp off len
+#endif
+{-# INLINE withPS #-}
+
+mkPS :: ForeignPtr Word8 -> Int -> Int -> ByteString
+#if MIN_VERSION_bytestring(0,11,0)
+mkPS fp off len = BS (plusForeignPtr fp off) len
+#else
+mkPS fp off len = PS fp off len
+#endif
+{-# INLINE mkPS #-}
diff --git a/attoparsec.cabal b/attoparsec.cabal
--- a/attoparsec.cabal
+++ b/attoparsec.cabal
@@ -1,16 +1,16 @@
 name:            attoparsec
-version:         0.13.2.4
+version:         0.13.2.5
 license:         BSD3
 license-file:    LICENSE
 category:        Text, Parsing
 author:          Bryan O'Sullivan <bos@serpentine.com>
 maintainer:      Bryan O'Sullivan <bos@serpentine.com>, Ben Gamari <ben@smart-cactus.org>
 stability:       experimental
-tested-with:     GHC == 7.0.4, GHC == 7.2.2, GHC == 7.4.2, GHC ==7.6.3, GHC ==7.8.4, GHC ==7.10.3, GHC ==8.0.2, GHC ==8.2.2, GHC==8.4.4, GHC==8.6.5, GHC==8.8.1, GHC==8.10.1
+tested-with:     GHC == 7.4.2, GHC ==7.6.3, GHC ==7.8.4, GHC ==7.10.3, GHC ==8.0.2, GHC ==8.2.2, GHC==8.4.4, GHC==8.6.5, GHC==8.8.1, GHC==8.10.1
 synopsis:        Fast combinator parsing for bytestrings and text
-cabal-version:   >= 1.8
-homepage:        https://github.com/bos/attoparsec
-bug-reports:     https://github.com/bos/attoparsec/issues
+cabal-version:   2.0
+homepage:        https://github.com/bgamari/attoparsec
+bug-reports:     https://github.com/bgamari/attoparsec/issues
 build-type:      Simple
 description:
     A fast parser combinator library, aimed particularly at dealing
@@ -40,12 +40,13 @@
 library
   build-depends: array,
                  base >= 4.3 && < 5,
-                 bytestring,
+                 bytestring <0.12,
                  containers,
                  deepseq,
                  scientific >= 0.3.1 && < 0.4,
                  transformers >= 0.2 && (< 0.4 || >= 0.4.1.0) && < 0.6,
-                 text >= 1.1.1.3
+                 text >= 1.1.1.3,
+                 ghc-prim <0.7
   if impl(ghc < 7.4)
     build-depends:
       bytestring < 0.10.4.0
@@ -72,12 +73,15 @@
   other-modules:   Data.Attoparsec.ByteString.Buffer
                    Data.Attoparsec.ByteString.FastSet
                    Data.Attoparsec.ByteString.Internal
+                   Data.Attoparsec.Internal.Compat
                    Data.Attoparsec.Internal.Fhthagn
                    Data.Attoparsec.Text.Buffer
                    Data.Attoparsec.Text.FastSet
                    Data.Attoparsec.Text.Internal
   ghc-options: -O2 -Wall
 
+  default-language: Haskell2010
+
   if flag(developer)
     ghc-prof-options: -auto-all
     ghc-options: -Werror
@@ -106,6 +110,7 @@
                   Data.Attoparsec.ByteString.Lazy
                   Data.Attoparsec.Combinator
                   Data.Attoparsec.Internal
+                  Data.Attoparsec.Internal.Compat
                   Data.Attoparsec.Internal.Fhthagn
                   Data.Attoparsec.Internal.Types
                   Data.Attoparsec.Number
@@ -127,7 +132,7 @@
     base,
     bytestring,
     deepseq >= 1.1,
-    QuickCheck >= 2.13.2 && < 2.14,
+    QuickCheck >= 2.13.2 && < 2.15,
     quickcheck-unicode,
     scientific,
     tasty >= 0.11,
@@ -136,6 +141,8 @@
     transformers,
     vector
 
+  default-language: Haskell2010
+
   if !impl(ghc >= 8.0)
     -- Data.Semigroup && Control.Monad.Fail are available in base-4.9+
     build-depends: fail == 4.9.*,
@@ -182,6 +189,8 @@
     unordered-containers,
     vector
 
+  default-language: Haskell2010
+
   if !impl(ghc >= 8.0)
     -- Data.Semigroup && Control.Monad.Fail are available in base-4.9+
     build-depends: fail == 4.9.*,
@@ -189,5 +198,5 @@
 
 source-repository head
   type:     git
-  location: https://github.com/bos/attoparsec
+  location: https://github.com/bgamari/attoparsec
 
