diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,11 @@
+haskell-libmagic (1.3) unstable; urgency=medium
+
+  * Use ByteString for magic results, rather than String
+  * Small improvements to documentation.
+  * Improved use of Coercion
+
+ -- Joey Hess <id@joeyh.name>  Mon, 26 Oct 2026 12:06:27 -0400
+
 haskell-libmagic (1.2) unstable; urgency=medium
 
   * Initial release, forked from John Goerzen's magic package.
diff --git a/Magic/Init.hsc b/Magic/Init.hsc
--- a/Magic/Init.hsc
+++ b/Magic/Init.hsc
@@ -15,7 +15,7 @@
    Stability  : provisional
    Portability: portable
 
-Initialization and shutdown for magic programs
+Initialization for magic programs
 
 Written by John Goerzen, jgoerzen\@complete.org
 -}
@@ -34,7 +34,7 @@
 import qualified Data.List.NonEmpty as NE
 import System.OsPath.Types
 import System.OsString.Internal.Types
-import Data.Coerce
+import Data.Type.Coercion
 import qualified Data.ByteString.Short as SBS
 
 {- | Create a Magic object.  You must call either 'magicLoadDefault'
@@ -59,8 +59,8 @@
     s = SBS.intercalate ":" (map conv (NE.toList l))
 
     conv p = case coercionToPlatformTypes of
-        Right _ -> getWindowsString (coerce p)
-        Left _ -> getPosixString (coerce p)
+        Left (_, co) -> getWindowsString (coerceWith co p)
+        Right (_, co) -> getPosixString (coerceWith co p)
 
 foreign import ccall unsafe "magic.h magic_open"
   magic_open :: CInt -> IO (Ptr CMagic)
diff --git a/Magic/Operations.hsc b/Magic/Operations.hsc
--- a/Magic/Operations.hsc
+++ b/Magic/Operations.hsc
@@ -15,7 +15,7 @@
    Stability  : provisional
    Portability: portable
 
-Initialization and shutdown for magic programs
+Operations for magic programs
 
 Written by John Goerzen, jgoerzen\@complete.org
 -}
@@ -36,40 +36,41 @@
 import Magic.TypesLL
 import System.OsPath.Types
 import System.OsString.Internal.Types
-import Data.Coerce
+import Data.Type.Coercion
+import qualified Data.ByteString as BS
 import qualified Data.ByteString.Short as SBS
 
 {- | Calls the Magic system on the specified file. -}
-magicFile :: Magic -> OsPath -> IO String
+magicFile :: Magic -> OsPath -> IO BS.ByteString
 magicFile magic fp =
     withMagicPtr magic $ \cmagic ->
       SBS.useAsCString sbsfp $ \cfp -> do
         res <- throwErrorIfNull "magicFile" cmagic (magic_file cmagic cfp)
-        peekCString res
+        BS.packCString res
   where
       sbsfp = case coercionToPlatformTypes of
-        Right _ -> getWindowsString (coerce fp)
-        Left _ -> getPosixString (coerce fp)
+        Left (_, co) -> getWindowsString (coerceWith co fp)
+        Right (_, co) -> getPosixString (coerceWith co fp)
 
 {- | Calls the Magic system on stdin. -}
-magicStdin :: Magic -> IO String
+magicStdin :: Magic -> IO BS.ByteString
 magicStdin magic =
     withMagicPtr magic $ \cmagic ->
      do res <- throwErrorIfNull "magicStdin" cmagic (magic_file cmagic nullPtr)
-        peekCString res
+        BS.packCString res
 
 {- | Calls the Magic system to process the given String.  Please note:
 it is not evaluated lazily. -}
-magicString :: Magic -> String -> IO String
+magicString :: Magic -> String -> IO BS.ByteString
 magicString m s = withCStringLen s (magicCString m)
 
 {- | Lower-level function used to call the Magic system to process a C 
 string. -}
-magicCString :: Magic -> CStringLen -> IO String
+magicCString :: Magic -> CStringLen -> IO BS.ByteString
 magicCString magic (cstr, len) =
     withMagicPtr magic $ \cmagic ->
      do res <- throwErrorIfNull "magicCString" cmagic (magic_buffer cmagic cstr (fromIntegral len))
-        peekCString res
+        BS.packCString res
 
 {- | Change the flags on an already-created object. -}
 magicSetFlags :: Magic -> [MagicFlag] -> IO ()
diff --git a/Magic/TypesLL.hsc b/Magic/TypesLL.hsc
--- a/Magic/TypesLL.hsc
+++ b/Magic/TypesLL.hsc
@@ -32,7 +32,7 @@
 
 {- | Main Magic handle.
 
-Magic objects are automatically closed (and memory freed) when they are
+Magic handles are automatically closed (and memory freed) when they are
 garbage-collected by Haskell.  There is no need to explicitly close them.
 
 Access to the C library is serialized, so multiple threads may safely
diff --git a/libmagic.cabal b/libmagic.cabal
--- a/libmagic.cabal
+++ b/libmagic.cabal
@@ -1,5 +1,5 @@
 Name: libmagic
-Version: 1.2
+Version: 1.3
 Cabal-Version: >= 1.10
 License: BSD3
 Maintainer: Joey Hess <id@joeyh.name>
