diff --git a/src/Data/Text/IO/Utf8.hs b/src/Data/Text/IO/Utf8.hs
index 2d0cd495a8ba469e9bf149794fb8e48cc4c093c0..33b79946ad3bd9a0d7bec035868bce6c81f141c5 100644
--- a/src/Data/Text/IO/Utf8.hs
+++ b/src/Data/Text/IO/Utf8.hs
@@ -29,7 +29,7 @@ import Prelude hiding (readFile, writeFile, appendFile, interact, getContents, g
 import Control.Exception (evaluate)
 import Control.Monad ((<=<))
 import Data.ByteString (ByteString)
-import qualified Data.ByteString as B
+import qualified Data.ByteString.Char8 as B
 import Data.Text (Text)
 import Data.Text.Encoding (decodeUtf8, encodeUtf8)
 import GHC.IO.Handle (Handle)
diff --git a/src/Data/Text/Internal/Encoding/Fusion.hs b/src/Data/Text/Internal/Encoding/Fusion.hs
index 71b87bc20d4d3cc88385ab4b97401eebbfa54748..afb4b6e2dd256e7d7166853b74be6a44f5b6efb8 100644
--- a/src/Data/Text/Internal/Encoding/Fusion.hs
+++ b/src/Data/Text/Internal/Encoding/Fusion.hs
@@ -38,7 +38,7 @@ module Data.Text.Internal.Encoding.Fusion
 import Control.Exception (assert)
 #endif
 import Data.Bits (shiftL, shiftR)
-import Data.ByteString.Internal (ByteString(..), mallocByteString, memcpy)
+import Data.ByteString.Internal (ByteString(..), mallocByteString)
 import Data.Text.Internal.Fusion (Step(..), Stream(..))
 import Data.Text.Internal.Fusion.Size
 import Data.Text.Encoding.Error
@@ -47,6 +47,7 @@ import Data.Text.Internal.Unsafe.Char (unsafeChr8, unsafeChr16, unsafeChr32)
 import Data.Text.Internal.Unsafe (unsafeWithForeignPtr)
 import Data.Word (Word8, Word16, Word32)
 import Foreign.ForeignPtr (ForeignPtr)
+import Foreign.Marshal.Utils (copyBytes)
 import Foreign.Storable (pokeByteOff)
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Unsafe as B
@@ -197,7 +198,7 @@ unstream (Stream next s0 len) = unsafeDupablePerformIO $ do
           dest <- mallocByteString destLen
           unsafeWithForeignPtr src  $ \src'  ->
               unsafeWithForeignPtr dest $ \dest' ->
-                  memcpy dest' src' srcLen
+                  copyBytes dest' src' srcLen
           return dest
 
 decodeError :: forall s. String -> String -> OnDecodeError -> Maybe Word8
diff --git a/src/Data/Text/Internal/Lazy/Encoding/Fusion.hs b/src/Data/Text/Internal/Lazy/Encoding/Fusion.hs
index 84e5bb9e90c60edecce1b68c81be51f09e488f05..8a65c00f165ed11273c16d11708fee653f7fedb4 100644
--- a/src/Data/Text/Internal/Lazy/Encoding/Fusion.hs
+++ b/src/Data/Text/Internal/Lazy/Encoding/Fusion.hs
@@ -49,8 +49,9 @@ import qualified Data.Text.Internal.Encoding.Utf16 as U16
 import qualified Data.Text.Internal.Encoding.Utf32 as U32
 import Data.Text.Unsafe (unsafeDupablePerformIO)
 import Foreign.ForeignPtr (ForeignPtr)
+import Foreign.Marshal.Utils (copyBytes)
 import Foreign.Storable (pokeByteOff)
-import Data.ByteString.Internal (mallocByteString, memcpy)
+import Data.ByteString.Internal (mallocByteString)
 #if defined(ASSERTS)
 import Control.Exception (assert)
 #endif
@@ -308,7 +309,7 @@ unstreamChunks chunkSize (Stream next s0 len0) = chunk s0 (upperBound 4 len0)
                 dest <- mallocByteString destLen
                 unsafeWithForeignPtr src  $ \src'  ->
                     unsafeWithForeignPtr dest $ \dest' ->
-                        memcpy dest' src' srcLen
+                        copyBytes dest' src' srcLen
                 return dest
 
 -- | /O(n)/ Convert a 'Stream' 'Word8' to a lazy 'ByteString'.
diff --git a/text.cabal b/text.cabal
index e7d2be910ebcf1bb0aa8335e1e30be554a04b2cf..b9674a836918a01357f3599c731cb53209792dff 100644
--- a/text.cabal
+++ b/text.cabal
@@ -189,7 +189,7 @@ library
     array            >= 0.3 && < 0.6,
     base             >= 4.10 && < 5,
     binary           >= 0.5 && < 0.9,
-    bytestring       >= 0.10.4 && < 0.12,
+    bytestring       >= 0.10.4 && < 0.13,
     deepseq          >= 1.1 && < 1.5,
     ghc-prim         >= 0.2 && < 0.11,
     template-haskell >= 2.5 && < 2.21