diff --git a/Data/Aeson/Parser/Internal.hs b/Data/Aeson/Parser/Internal.hs
--- a/Data/Aeson/Parser/Internal.hs
+++ b/Data/Aeson/Parser/Internal.hs
@@ -322,13 +322,19 @@
   -- not sure whether >= or bit hackery is faster
   -- perfectly, we shouldn't care, it's compiler job.
   s <- A.takeWhile (\w -> w /= DOUBLE_QUOTE && w /= BACKSLASH && w >= 0x20 && w < 0x80)
-  let txt = TE.decodeUtf8 s
+  let txt = unsafeDecodeASCII s
   mw <- A.peekWord8
   case mw of
     Nothing           -> fail "string without end"
     Just DOUBLE_QUOTE -> A.anyWord8 $> txt
     Just w | w < 0x20 -> fail "unescaped control character"
     _                 -> jstringSlow s
+
+-- | The input is assumed to contain only 7bit ASCII characters (i.e. @< 0x80@).
+--   We use TE.decodeLatin1 here because TE.decodeASCII is currently (text-1.2.4.0)
+--   deprecated and equal to TE.decodeUtf8, which is slower than TE.decodeLatin1.
+unsafeDecodeASCII :: B.ByteString -> Text
+unsafeDecodeASCII = TE.decodeLatin1
 
 jstringSlow :: B.ByteString -> Parser Text
 {-# INLINE jstringSlow #-}
diff --git a/aeson.cabal b/aeson.cabal
--- a/aeson.cabal
+++ b/aeson.cabal
@@ -1,5 +1,5 @@
 name:            aeson
-version:         1.5.4.0
+version:         1.5.4.1
 license:         BSD3
 license-file:    LICENSE
 category:        Text, Web, JSON
@@ -100,7 +100,7 @@
   -- GHC bundled libs
   build-depends:
     base             >= 4.7.0.0 && < 5,
-    bytestring       >= 0.10.4.0 && < 0.11,
+    bytestring       >= 0.10.4.0 && < 0.12,
     containers       >= 0.5.5.1 && < 0.7,
     deepseq          >= 1.3.0.0 && < 1.5,
     ghc-prim         >= 0.2     && < 0.8,
@@ -143,7 +143,7 @@
     scientific           >= 0.3.6.2  && < 0.4,
     strict               >= 0.4      && < 0.5,
     tagged               >= 0.8.6    && < 0.9,
-    th-abstraction       >= 0.2.8.0  && < 0.4,
+    th-abstraction       >= 0.2.8.0  && < 0.5,
     these                >= 1.1      && < 1.2,
     unordered-containers >= 0.2.10.0 && < 0.3,
     uuid-types           >= 1.0.3    && < 1.1,
@@ -217,7 +217,7 @@
     dlist,
     Diff >= 0.4 && < 0.5,
     filepath,
-    generic-deriving >= 1.10 && < 1.14,
+    generic-deriving >= 1.10 && < 1.15,
     ghc-prim >= 0.2,
     hashable >= 1.2.4.0,
     scientific,
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,9 @@
 For the latest version of this document, please see [https://github.com/bos/aeson/blob/master/changelog.md](https://github.com/bos/aeson/blob/master/changelog.md).
 
+#### 1.5.4.1
+* Use `Text.Encoding.decodeLatin1` to speed up ASCII string decoding, thanks to Dmitry Ivanov.
+* Support `bytestring 0.11.*` and `th-abstraction 0.4.*`, thanks to Oleg Grenrus.
+
 ### 1.5.4.0
 
 * Add instances for `ToJSONKey` and `FromJSONKey` to `Const`, thanks to Dan Fithian.
diff --git a/ffi/Data/Aeson/Parser/UnescapeFFI.hs b/ffi/Data/Aeson/Parser/UnescapeFFI.hs
--- a/ffi/Data/Aeson/Parser/UnescapeFFI.hs
+++ b/ffi/Data/Aeson/Parser/UnescapeFFI.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE ForeignFunctionInterface #-}
 {-# LANGUAGE MagicHash #-}
 {-# LANGUAGE UnliftedFFITypes #-}
@@ -29,7 +30,12 @@
     -> Ptr Word8 -> Ptr Word8 -> IO CInt
 
 unescapeText' :: ByteString -> Text
+#if MIN_VERSION_bytestring(0,11,0)
+unescapeText' (BS fp len) = runText $ \done -> do
+  let off = 0
+#else
 unescapeText' (PS fp off len) = runText $ \done -> do
+#endif
   let go dest = withForeignPtr fp $ \ptr ->
         with (0::CSize) $ \destOffPtr -> do
           let end = ptr `plusPtr` (off + len)
