diff --git a/lawful-conversions.cabal b/lawful-conversions.cabal
--- a/lawful-conversions.cabal
+++ b/lawful-conversions.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name: lawful-conversions
-version: 0.1.5
+version: 0.1.6
 synopsis: Lawful typeclasses for bidirectional conversion between types
 category: Conversion
 homepage: https://github.com/nikita-volkov/lawful-conversions
@@ -58,7 +58,7 @@
   type: git
   location: git://github.com/nikita-volkov/lawful-conversions.git
 
-common language-settings
+common base
   default-language: Haskell2010
   default-extensions:
     BlockArguments
@@ -73,7 +73,7 @@
     UndecidableSuperClasses
 
 library
-  import: language-settings
+  import: base
   hs-source-dirs: src/library
   exposed-modules: LawfulConversions
   other-modules:
@@ -99,6 +99,7 @@
     LawfulConversions.Relations.ByteStringAndLazyByteStringBuilder
     LawfulConversions.Relations.ByteStringAndLazyText
     LawfulConversions.Relations.ByteStringAndShortByteString
+    LawfulConversions.Relations.ByteStringAndString
     LawfulConversions.Relations.ByteStringAndText
     LawfulConversions.Relations.ByteStringAndTextArray
     LawfulConversions.Relations.ByteStringAndWord8List
@@ -117,6 +118,7 @@
     LawfulConversions.Relations.LazyByteStringAndLazyByteStringBuilder
     LawfulConversions.Relations.LazyByteStringAndLazyText
     LawfulConversions.Relations.LazyByteStringAndShortByteString
+    LawfulConversions.Relations.LazyByteStringAndString
     LawfulConversions.Relations.LazyByteStringAndText
     LawfulConversions.Relations.LazyByteStringAndTextArray
     LawfulConversions.Relations.LazyByteStringAndWord8List
@@ -164,7 +166,7 @@
     vector >=0.12 && <0.14,
 
 test-suite test
-  import: language-settings
+  import: base
   type: exitcode-stdio-1.0
   hs-source-dirs: src/test
   main-is: Main.hs
diff --git a/src/library/LawfulConversions/Relations.hs b/src/library/LawfulConversions/Relations.hs
--- a/src/library/LawfulConversions/Relations.hs
+++ b/src/library/LawfulConversions/Relations.hs
@@ -12,6 +12,7 @@
 import LawfulConversions.Relations.ByteStringAndLazyByteStringBuilder ()
 import LawfulConversions.Relations.ByteStringAndLazyText ()
 import LawfulConversions.Relations.ByteStringAndShortByteString ()
+import LawfulConversions.Relations.ByteStringAndString ()
 import LawfulConversions.Relations.ByteStringAndText ()
 import LawfulConversions.Relations.ByteStringAndTextArray ()
 import LawfulConversions.Relations.ByteStringAndWord8List ()
@@ -30,6 +31,7 @@
 import LawfulConversions.Relations.LazyByteStringAndLazyByteStringBuilder ()
 import LawfulConversions.Relations.LazyByteStringAndLazyText ()
 import LawfulConversions.Relations.LazyByteStringAndShortByteString ()
+import LawfulConversions.Relations.LazyByteStringAndString ()
 import LawfulConversions.Relations.LazyByteStringAndText ()
 import LawfulConversions.Relations.LazyByteStringAndTextArray ()
 import LawfulConversions.Relations.LazyByteStringAndWord8List ()
diff --git a/src/library/LawfulConversions/Relations/ByteStringAndString.hs b/src/library/LawfulConversions/Relations/ByteStringAndString.hs
new file mode 100644
--- /dev/null
+++ b/src/library/LawfulConversions/Relations/ByteStringAndString.hs
@@ -0,0 +1,18 @@
+{-# OPTIONS_GHC -Wno-orphans #-}
+
+module LawfulConversions.Relations.ByteStringAndString where
+
+import qualified Data.Text
+import qualified Data.Text.Encoding
+import qualified Data.Text.Encoding.Error
+import LawfulConversions.Classes
+import LawfulConversions.Prelude
+
+-- | UTF-8 codec.
+instance IsSome ByteString String where
+  to = Data.Text.Encoding.encodeUtf8 . Data.Text.pack
+  maybeFrom = either (const Nothing) (Just . Data.Text.unpack) . Data.Text.Encoding.decodeUtf8'
+
+-- | Lenient UTF-8 decoding.
+instance IsMany ByteString String where
+  from = Data.Text.unpack . Data.Text.Encoding.decodeUtf8With Data.Text.Encoding.Error.lenientDecode
diff --git a/src/library/LawfulConversions/Relations/LazyByteStringAndString.hs b/src/library/LawfulConversions/Relations/LazyByteStringAndString.hs
new file mode 100644
--- /dev/null
+++ b/src/library/LawfulConversions/Relations/LazyByteStringAndString.hs
@@ -0,0 +1,19 @@
+{-# OPTIONS_GHC -Wno-orphans #-}
+
+module LawfulConversions.Relations.LazyByteStringAndString where
+
+import qualified Data.ByteString.Lazy
+import qualified Data.Text.Encoding.Error
+import qualified Data.Text.Lazy
+import qualified Data.Text.Lazy.Encoding
+import LawfulConversions.Classes
+import LawfulConversions.Prelude
+
+-- | UTF-8 codec.
+instance IsSome Data.ByteString.Lazy.ByteString String where
+  to = Data.Text.Lazy.Encoding.encodeUtf8 . Data.Text.Lazy.pack
+  maybeFrom = either (const Nothing) (Just . Data.Text.Lazy.unpack) . Data.Text.Lazy.Encoding.decodeUtf8'
+
+-- | Lenient UTF-8 decoding.
+instance IsMany Data.ByteString.Lazy.ByteString String where
+  from = Data.Text.Lazy.unpack . Data.Text.Lazy.Encoding.decodeUtf8With Data.Text.Encoding.Error.lenientDecode
