diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,7 @@
+# 0.2.1
+
+- Expose `make_unibyte_string` as `makeBinaryString`
+
 # 0.2
 
 - Major rework of the package’s core
diff --git a/Readme.md b/Readme.md
--- a/Readme.md
+++ b/Readme.md
@@ -29,8 +29,9 @@
 
 ## FAQ
 ### How do I start writing my own extensions?
-Some day there will be a proper tutorial for using this package.
-For the time being the best place to start is
+See tutorial at https://github.com/sergv/emacs-module/blob/master/Tutorial.md.
+
+Also check out
 [this package’s tests](https://github.com/sergv/emacs-module/blob/master/test/src/Emacs/TestsInit.hs).
 
 ### What about Windows?
@@ -51,9 +52,6 @@
 marhsalling. In this approach, an extension will look like a shared
 library/dll that can be loaded by standard emacs with `(load "/tmp/libmy-ext.so")`.
 
-### Is there a tutorial?
-It’s at https://github.com/sergv/emacs-module/blob/master/Tutorial.md.
-
 ## Supported GHC versions
 
-Tested with GHC `9.2`, `9.4`, `9.6`.
+Tested with GHC `9.2`, `9.4`, `9.6`, `9.8`.
diff --git a/emacs-module.cabal b/emacs-module.cabal
--- a/emacs-module.cabal
+++ b/emacs-module.cabal
@@ -3,7 +3,7 @@
 name:
   emacs-module
 version:
-  0.2
+  0.2.1
 category: Foreign, Foreign binding
 
 synopsis:
@@ -29,7 +29,11 @@
 maintainer:
   Sergey Vinokurov <serg.foo@gmail.com>
 tested-with:
-    GHC == 9.2.7, GHC == 9.4.5, GHC == 9.6.1
+  , GHC == 9.2.8
+  , GHC == 9.4.7
+  , GHC == 9.6.3
+  , GHC == 9.8.1
+
 extra-source-files:
   cbits/emacs-module.h
 
@@ -67,7 +71,6 @@
     GHC2021
 
   default-extensions:
-    ImportQualifiedPost
     LambdaCase
 
   ghc-options:
@@ -90,6 +93,11 @@
   if impl(ghc >= 9.2)
     ghc-options:
       -Wno-missing-kind-signatures
+
+  if impl(ghc >= 9.8)
+    ghc-options:
+      -Wno-missing-role-annotations
+      -Wno-missing-poly-kind-signatures
 
 library
   import: ghc-options
diff --git a/src/Data/Emacs/Module/Raw/Env.hsc b/src/Data/Emacs/Module/Raw/Env.hsc
--- a/src/Data/Emacs/Module/Raw/Env.hsc
+++ b/src/Data/Emacs/Module/Raw/Env.hsc
@@ -49,6 +49,7 @@
   , makeFloat
   , copyStringContents
   , makeString
+  , makeUnibyteString
   , makeUserPtr
   , getUserPtr
   , setUserPtr
@@ -411,6 +412,21 @@
   -> CPtrdiff -- ^ Length.
   -> m (RawValue 'Regular)
 makeString = makeStringTH
+
+
+$(wrapEmacsFunc "makeUnibyteStringTH" Unsafe
+   [e| (#peek emacs_env, make_unibyte_string) |]
+   [t| Env -> CString -> CPtrdiff -> IO (RawValue 'Regular) |])
+
+{-# INLINE makeUnibyteString #-}
+makeUnibyteString
+  :: MonadIO m
+  => Env
+  -> CString  -- ^ Any string, may contain anything bytes and is
+              -- not required to be terminated with null byte.
+  -> CPtrdiff -- ^ Length.
+  -> m (RawValue 'Regular)
+makeUnibyteString = makeUnibyteStringTH
 
 
 $(wrapEmacsFunc "makeUserPtrTH" Unsafe
diff --git a/src/Data/Emacs/Module/Raw/Value/Internal.hs b/src/Data/Emacs/Module/Raw/Value/Internal.hs
--- a/src/Data/Emacs/Module/Raw/Value/Internal.hs
+++ b/src/Data/Emacs/Module/Raw/Value/Internal.hs
@@ -6,6 +6,7 @@
 -- Maintainer  :  serg.foo@gmail.com
 ----------------------------------------------------------------------------
 
+{-# LANGUAGE CPP          #-}
 {-# LANGUAGE DataKinds    #-}
 {-# LANGUAGE DerivingVia  #-}
 {-# LANGUAGE TypeFamilies #-}
@@ -25,7 +26,9 @@
 import Data.Vector.Generic.Mutable qualified as GM
 import Data.Vector.Primitive qualified as P
 import Data.Vector.Unboxed qualified as U
+#if !MIN_VERSION_vector(0, 13, 1)
 import Data.Vector.Unboxed.Base qualified as U
+#endif
 import Foreign
 import GHC.Generics (Generic)
 import Prettyprinter (Pretty(..))
diff --git a/src/Data/Emacs/Module/Value/Internal.hs b/src/Data/Emacs/Module/Value/Internal.hs
--- a/src/Data/Emacs/Module/Value/Internal.hs
+++ b/src/Data/Emacs/Module/Value/Internal.hs
@@ -6,6 +6,7 @@
 -- Maintainer  :  serg.foo@gmail.com
 ----------------------------------------------------------------------------
 
+{-# LANGUAGE CPP                  #-}
 {-# LANGUAGE DataKinds            #-}
 {-# LANGUAGE DerivingVia          #-}
 {-# LANGUAGE TypeFamilies         #-}
@@ -23,7 +24,9 @@
 import Data.Vector.Generic.Mutable qualified as GM
 import Data.Vector.Primitive qualified as P
 import Data.Vector.Unboxed qualified as U
+#if !MIN_VERSION_vector(0, 13, 1)
 import Data.Vector.Unboxed.Base qualified as U
+#endif
 import GHC.Generics (Generic)
 import Prettyprinter (Pretty)
 
diff --git a/src/Emacs/Module/Monad.hs b/src/Emacs/Module/Monad.hs
--- a/src/Emacs/Module/Monad.hs
+++ b/src/Emacs/Module/Monad.hs
@@ -336,6 +336,11 @@
     BSU.unsafeUseAsCStringLen x $ \(pStr, len) ->
       coerce $ Env.makeString @IO env pStr (fromIntegral len)
 
+  makeBinaryString :: WithCallStack => BS.ByteString -> EmacsM s (Value s)
+  makeBinaryString x = withEnv $ \env ->
+    BSU.unsafeUseAsCStringLen x $ \(pStr, len) ->
+      coerce $ Env.makeUnibyteString @IO env pStr (fromIntegral len)
+
   extractUserPtr :: WithCallStack => Value s -> EmacsM s (Ptr a)
   extractUserPtr x = EmacsM $ do
     Environment{eEnv, eNonLocalState, eArgsCache} <- ask
diff --git a/src/Emacs/Module/Monad/Class.hs b/src/Emacs/Module/Monad/Class.hs
--- a/src/Emacs/Module/Monad/Class.hs
+++ b/src/Emacs/Module/Monad/Class.hs
@@ -174,6 +174,8 @@
   -- | Convert a utf8-encoded ByteString into an Emacs value.
   makeString :: WithCallStack => BS.ByteString -> m s (v s)
 
+  -- | Convert any ByteString into an Emacs unibyte string.
+  makeBinaryString :: WithCallStack => BS.ByteString -> m s (v s)
 
   -- | Extract a user pointer from an Emacs value.
   extractUserPtr :: WithCallStack => v s -> m s (Ptr a)
