diff --git a/Data/String/Conversions.hs b/Data/String/Conversions.hs
deleted file mode 100644
--- a/Data/String/Conversions.hs
+++ /dev/null
@@ -1,184 +0,0 @@
-{-# language MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances, CPP #-}
-
--- | A type class for converting strings.
--- Supported types are:
---
---     * 'String'
---
---     * strict 'Data.ByteString.ByteString'
---
---     * lazy 'Data.ByteString.Lazy.ByteString'
---
---     * strict 'Data.Text.Text'
---
---     * lazy 'Data.Text.Lazy.Text'
---
--- Assumes UTF-8 encoding for both types of ByteStrings.
-
-module Data.String.Conversions (
-    -- * class and conversions
-    ConvertibleStrings(..),
-    cs,
-
-    -- * type synonyms
-    StrictByteString,
-    SBS,
-    LazyByteString,
-    LBS,
-    StrictText,
-    ST,
-    LazyText,
-    LT,
-
-    -- | Generic string concatenation (with ghc >= 7.4 this is a re-export from Data.Monoid
-    -- to avoid clashes.)
-    (<>),
-  ) where
-
-
-import Data.Monoid
-
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative
-#endif
-
--- string imports
-
-import qualified Data.ByteString
-import qualified Data.ByteString.UTF8
-
-import qualified Data.ByteString.Lazy
-import qualified Data.ByteString.Lazy.UTF8
-
-import qualified Data.Text
-import qualified Data.Text.Encoding hiding (decodeUtf8)
-import qualified Data.Text.Encoding.Error
-
-import qualified Data.Text.Lazy
-import qualified Data.Text.Lazy.Encoding hiding (decodeUtf8)
-
-
--- * class and conversions
-
-class ConvertibleStrings a b where
-    convertString :: a -> b
-
-cs :: ConvertibleStrings a b => a -> b
-cs = convertString
-
-#if !MIN_VERSION_base(4,5,0)
-(<>) :: Monoid s => s -> s -> s
-(<>) = mappend
-#endif
-
--- * type synonyms
-
-type StrictByteString = Data.ByteString.ByteString
-type SBS              = Data.ByteString.ByteString
-
-type LazyByteString = Data.ByteString.Lazy.ByteString
-type LBS            = Data.ByteString.Lazy.ByteString
-
-type StrictText = Data.Text.Text
-type ST         = Data.Text.Text
-
-type LazyText = Data.Text.Lazy.Text
-type LT       = Data.Text.Lazy.Text
-
-
--- instances
--- ---------
-
--- from String
-
-instance ConvertibleStrings String String where
-    convertString = id
-
-instance ConvertibleStrings String StrictByteString where
-    convertString = Data.ByteString.UTF8.fromString
-
-instance ConvertibleStrings String LazyByteString where
-    convertString = Data.ByteString.Lazy.UTF8.fromString
-
-instance ConvertibleStrings String StrictText where
-    convertString = Data.Text.pack
-
-instance ConvertibleStrings String LazyText where
-    convertString = Data.Text.Lazy.pack
-
-
--- from StrictByteString
-
-instance ConvertibleStrings StrictByteString StrictByteString where
-    convertString = id
-
-instance ConvertibleStrings StrictByteString String where
-    convertString = Data.ByteString.UTF8.toString
-
-instance ConvertibleStrings StrictByteString LazyByteString where
-    convertString = Data.ByteString.Lazy.fromChunks . pure
-
-instance ConvertibleStrings StrictByteString StrictText where
-    convertString = Data.Text.Encoding.decodeUtf8With Data.Text.Encoding.Error.lenientDecode
-
-instance ConvertibleStrings StrictByteString LazyText where
-    convertString =
-        Data.Text.Lazy.Encoding.decodeUtf8With Data.Text.Encoding.Error.lenientDecode .
-        Data.ByteString.Lazy.fromChunks . pure
-
-
--- from LazyByteString
-
-instance ConvertibleStrings LazyByteString LazyByteString where
-    convertString = id
-
-instance ConvertibleStrings LazyByteString String where
-    convertString = Data.ByteString.Lazy.UTF8.toString
-
-instance ConvertibleStrings LazyByteString StrictByteString where
-    convertString = mconcat . Data.ByteString.Lazy.toChunks
-
-instance ConvertibleStrings LazyByteString StrictText where
-    convertString =
-        Data.Text.Encoding.decodeUtf8With  Data.Text.Encoding.Error.lenientDecode .
-        mconcat . Data.ByteString.Lazy.toChunks
-
-instance ConvertibleStrings LazyByteString LazyText where
-    convertString = Data.Text.Lazy.Encoding.decodeUtf8With Data.Text.Encoding.Error.lenientDecode
-
-
--- from StrictText
-
-instance ConvertibleStrings StrictText StrictText where
-    convertString = id
-
-instance ConvertibleStrings StrictText String where
-    convertString = Data.Text.unpack
-
-instance ConvertibleStrings StrictText StrictByteString where
-    convertString = Data.Text.Encoding.encodeUtf8
-
-instance ConvertibleStrings StrictText LazyByteString where
-    convertString = Data.ByteString.Lazy.fromChunks . pure . Data.Text.Encoding.encodeUtf8
-
-instance ConvertibleStrings StrictText LazyText where
-    convertString = Data.Text.Lazy.fromChunks . pure
-
-
--- from LazyText
-
-instance ConvertibleStrings LazyText LazyText where
-    convertString = id
-
-instance ConvertibleStrings LazyText String where
-    convertString = Data.Text.Lazy.unpack
-
-instance ConvertibleStrings LazyText StrictByteString where
-    convertString =
-        mconcat . Data.ByteString.Lazy.toChunks . Data.Text.Lazy.Encoding.encodeUtf8
-
-instance ConvertibleStrings LazyText LazyByteString where
-    convertString = Data.Text.Lazy.Encoding.encodeUtf8
-
-instance ConvertibleStrings LazyText StrictText where
-    convertString = mconcat . Data.Text.Lazy.toChunks
diff --git a/Data/String/Conversions/Monomorphic.hs b/Data/String/Conversions/Monomorphic.hs
deleted file mode 100644
--- a/Data/String/Conversions/Monomorphic.hs
+++ /dev/null
@@ -1,95 +0,0 @@
-{-# LANGUAGE FlexibleContexts #-}
-
--- | Monomorphic conversion functions that are useful when you wish to
--- be explicit about the conversion without writing a type signature
--- or when 'Data.String.Conversions.cs' is ambiguous due to
--- polymorphic inputs or outputs.
---
--- All functions in this module have 'Data.String.Conversions.cs' as
--- their implementation.
-module Data.String.Conversions.Monomorphic (
-    -- * From a polymorphic input to a monomorphic output
-    toString,
-    toStrictByteString,
-    toSBS,
-    toLazyByteString,
-    toLBS,
-    toStrictText,
-    toST,
-    toLazyText,
-    toLT,
-
-    -- * From a monomorphic input to a polymorphic output
-
-    fromString,
-    fromStrictByteString,
-    fromSBS,
-    fromLazyByteString,
-    fromLBS,
-    fromStrictText,
-    fromST,
-    fromLazyText,
-    fromLT
-  ) where
-
-import Prelude (String)
-
-import Data.String.Conversions
-
--- to a monomorphic type
-
-toString :: ConvertibleStrings a String => a -> String
-toString = cs
-
-toStrictByteString :: ConvertibleStrings a StrictByteString => a -> StrictByteString
-toStrictByteString = cs
-
-toSBS :: ConvertibleStrings a SBS => a -> SBS
-toSBS = cs
-
-toLazyByteString :: ConvertibleStrings a LazyByteString => a -> LazyByteString
-toLazyByteString = cs
-
-toLBS :: ConvertibleStrings a LBS => a -> LBS
-toLBS = cs
-
-toStrictText :: ConvertibleStrings a StrictText => a -> StrictText
-toStrictText = cs
-
-toST :: ConvertibleStrings a ST => a -> ST
-toST = cs
-
-toLazyText :: ConvertibleStrings a LazyText => a -> LazyText
-toLazyText = cs
-
-toLT :: ConvertibleStrings a LT => a -> LT
-toLT = cs
-
--- from a monomorphic type
-
-fromString :: ConvertibleStrings String a => String -> a
-fromString = cs
-
-fromStrictByteString :: ConvertibleStrings StrictByteString a => StrictByteString -> a
-fromStrictByteString = cs
-
-fromSBS :: ConvertibleStrings SBS a => SBS -> a
-fromSBS = cs
-
-fromLazyByteString :: ConvertibleStrings LazyByteString a => LazyByteString -> a
-fromLazyByteString = cs
-
-fromLBS :: ConvertibleStrings LBS a => LBS -> a
-fromLBS = cs
-
-fromStrictText :: ConvertibleStrings StrictText a => StrictText -> a
-fromStrictText = cs
-
-fromST :: ConvertibleStrings ST a => ST -> a
-fromST = cs
-
-fromLazyText :: ConvertibleStrings LazyText a => LazyText -> a
-fromLazyText = cs
-
-fromLT :: ConvertibleStrings LT a => LT -> a
-fromLT = cs
diff --git a/src/Data/String/Conversions.hs b/src/Data/String/Conversions.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/String/Conversions.hs
@@ -0,0 +1,184 @@
+{-# language MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances, CPP #-}
+
+-- | A type class for converting strings.
+-- Supported types are:
+--
+--     * 'String'
+--
+--     * strict 'Data.ByteString.ByteString'
+--
+--     * lazy 'Data.ByteString.Lazy.ByteString'
+--
+--     * strict 'Data.Text.Text'
+--
+--     * lazy 'Data.Text.Lazy.Text'
+--
+-- Assumes UTF-8 encoding for both types of ByteStrings.
+
+module Data.String.Conversions (
+    -- * class and conversions
+    ConvertibleStrings(..),
+    cs,
+
+    -- * type synonyms
+    StrictByteString,
+    SBS,
+    LazyByteString,
+    LBS,
+    StrictText,
+    ST,
+    LazyText,
+    LT,
+
+    -- | Generic string concatenation (with ghc >= 7.4 this is a re-export from Data.Monoid
+    -- to avoid clashes.)
+    (<>),
+  ) where
+
+
+import Data.Monoid
+
+#if !MIN_VERSION_base(4,8,0)
+import Control.Applicative
+#endif
+
+-- string imports
+
+import qualified Data.ByteString
+import qualified Data.ByteString.UTF8
+
+import qualified Data.ByteString.Lazy
+import qualified Data.ByteString.Lazy.UTF8
+
+import qualified Data.Text
+import qualified Data.Text.Encoding hiding (decodeUtf8)
+import qualified Data.Text.Encoding.Error
+
+import qualified Data.Text.Lazy
+import qualified Data.Text.Lazy.Encoding hiding (decodeUtf8)
+
+
+-- * class and conversions
+
+class ConvertibleStrings a b where
+    convertString :: a -> b
+
+cs :: ConvertibleStrings a b => a -> b
+cs = convertString
+
+#if !MIN_VERSION_base(4,5,0)
+(<>) :: Monoid s => s -> s -> s
+(<>) = mappend
+#endif
+
+-- * type synonyms
+
+type StrictByteString = Data.ByteString.ByteString
+type SBS              = Data.ByteString.ByteString
+
+type LazyByteString = Data.ByteString.Lazy.ByteString
+type LBS            = Data.ByteString.Lazy.ByteString
+
+type StrictText = Data.Text.Text
+type ST         = Data.Text.Text
+
+type LazyText = Data.Text.Lazy.Text
+type LT       = Data.Text.Lazy.Text
+
+
+-- instances
+-- ---------
+
+-- from String
+
+instance ConvertibleStrings String String where
+    convertString = id
+
+instance ConvertibleStrings String StrictByteString where
+    convertString = Data.ByteString.UTF8.fromString
+
+instance ConvertibleStrings String LazyByteString where
+    convertString = Data.ByteString.Lazy.UTF8.fromString
+
+instance ConvertibleStrings String StrictText where
+    convertString = Data.Text.pack
+
+instance ConvertibleStrings String LazyText where
+    convertString = Data.Text.Lazy.pack
+
+
+-- from StrictByteString
+
+instance ConvertibleStrings StrictByteString StrictByteString where
+    convertString = id
+
+instance ConvertibleStrings StrictByteString String where
+    convertString = Data.ByteString.UTF8.toString
+
+instance ConvertibleStrings StrictByteString LazyByteString where
+    convertString = Data.ByteString.Lazy.fromChunks . pure
+
+instance ConvertibleStrings StrictByteString StrictText where
+    convertString = Data.Text.Encoding.decodeUtf8With Data.Text.Encoding.Error.lenientDecode
+
+instance ConvertibleStrings StrictByteString LazyText where
+    convertString =
+        Data.Text.Lazy.Encoding.decodeUtf8With Data.Text.Encoding.Error.lenientDecode .
+        Data.ByteString.Lazy.fromChunks . pure
+
+
+-- from LazyByteString
+
+instance ConvertibleStrings LazyByteString LazyByteString where
+    convertString = id
+
+instance ConvertibleStrings LazyByteString String where
+    convertString = Data.ByteString.Lazy.UTF8.toString
+
+instance ConvertibleStrings LazyByteString StrictByteString where
+    convertString = mconcat . Data.ByteString.Lazy.toChunks
+
+instance ConvertibleStrings LazyByteString StrictText where
+    convertString =
+        Data.Text.Encoding.decodeUtf8With  Data.Text.Encoding.Error.lenientDecode .
+        mconcat . Data.ByteString.Lazy.toChunks
+
+instance ConvertibleStrings LazyByteString LazyText where
+    convertString = Data.Text.Lazy.Encoding.decodeUtf8With Data.Text.Encoding.Error.lenientDecode
+
+
+-- from StrictText
+
+instance ConvertibleStrings StrictText StrictText where
+    convertString = id
+
+instance ConvertibleStrings StrictText String where
+    convertString = Data.Text.unpack
+
+instance ConvertibleStrings StrictText StrictByteString where
+    convertString = Data.Text.Encoding.encodeUtf8
+
+instance ConvertibleStrings StrictText LazyByteString where
+    convertString = Data.ByteString.Lazy.fromChunks . pure . Data.Text.Encoding.encodeUtf8
+
+instance ConvertibleStrings StrictText LazyText where
+    convertString = Data.Text.Lazy.fromChunks . pure
+
+
+-- from LazyText
+
+instance ConvertibleStrings LazyText LazyText where
+    convertString = id
+
+instance ConvertibleStrings LazyText String where
+    convertString = Data.Text.Lazy.unpack
+
+instance ConvertibleStrings LazyText StrictByteString where
+    convertString =
+        mconcat . Data.ByteString.Lazy.toChunks . Data.Text.Lazy.Encoding.encodeUtf8
+
+instance ConvertibleStrings LazyText LazyByteString where
+    convertString = Data.Text.Lazy.Encoding.encodeUtf8
+
+instance ConvertibleStrings LazyText StrictText where
+    convertString = mconcat . Data.Text.Lazy.toChunks
diff --git a/src/Data/String/Conversions/Monomorphic.hs b/src/Data/String/Conversions/Monomorphic.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/String/Conversions/Monomorphic.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE FlexibleContexts #-}
+
+-- | Monomorphic conversion functions that are useful when you wish to
+-- be explicit about the conversion without writing a type signature
+-- or when 'Data.String.Conversions.cs' is ambiguous due to
+-- polymorphic inputs or outputs.
+--
+-- All functions in this module have 'Data.String.Conversions.cs' as
+-- their implementation.
+module Data.String.Conversions.Monomorphic (
+    -- * From a polymorphic input to a monomorphic output
+    toString,
+    toStrictByteString,
+    toSBS,
+    toLazyByteString,
+    toLBS,
+    toStrictText,
+    toST,
+    toLazyText,
+    toLT,
+
+    -- * From a monomorphic input to a polymorphic output
+
+    fromString,
+    fromStrictByteString,
+    fromSBS,
+    fromLazyByteString,
+    fromLBS,
+    fromStrictText,
+    fromST,
+    fromLazyText,
+    fromLT
+  ) where
+
+import Prelude (String)
+
+import Data.String.Conversions
+
+-- to a monomorphic type
+
+toString :: ConvertibleStrings a String => a -> String
+toString = cs
+
+toStrictByteString :: ConvertibleStrings a StrictByteString => a -> StrictByteString
+toStrictByteString = cs
+
+toSBS :: ConvertibleStrings a SBS => a -> SBS
+toSBS = cs
+
+toLazyByteString :: ConvertibleStrings a LazyByteString => a -> LazyByteString
+toLazyByteString = cs
+
+toLBS :: ConvertibleStrings a LBS => a -> LBS
+toLBS = cs
+
+toStrictText :: ConvertibleStrings a StrictText => a -> StrictText
+toStrictText = cs
+
+toST :: ConvertibleStrings a ST => a -> ST
+toST = cs
+
+toLazyText :: ConvertibleStrings a LazyText => a -> LazyText
+toLazyText = cs
+
+toLT :: ConvertibleStrings a LT => a -> LT
+toLT = cs
+
+-- from a monomorphic type
+
+fromString :: ConvertibleStrings String a => String -> a
+fromString = cs
+
+fromStrictByteString :: ConvertibleStrings StrictByteString a => StrictByteString -> a
+fromStrictByteString = cs
+
+fromSBS :: ConvertibleStrings SBS a => SBS -> a
+fromSBS = cs
+
+fromLazyByteString :: ConvertibleStrings LazyByteString a => LazyByteString -> a
+fromLazyByteString = cs
+
+fromLBS :: ConvertibleStrings LBS a => LBS -> a
+fromLBS = cs
+
+fromStrictText :: ConvertibleStrings StrictText a => StrictText -> a
+fromStrictText = cs
+
+fromST :: ConvertibleStrings ST a => ST -> a
+fromST = cs
+
+fromLazyText :: ConvertibleStrings LazyText a => LazyText -> a
+fromLazyText = cs
+
+fromLT :: ConvertibleStrings LT a => LT -> a
+fromLT = cs
diff --git a/string-conversions.cabal b/string-conversions.cabal
--- a/string-conversions.cabal
+++ b/string-conversions.cabal
@@ -1,32 +1,57 @@
--- Initial string-conversions.cabal generated by cabal init. For further
--- documentation, see http://haskell.org/cabal/users-guide/
+-- This file has been generated from package.yaml by hpack version 0.15.0.
+--
+-- see: https://github.com/sol/hpack
 
 name:                string-conversions
-version:             0.4
+version:             0.4.0.1
 synopsis:            Simplifies dealing with different types for strings
-description:         Provides a simple type class for converting values
-                     of different string types
-                     into values of other string types.
+description:         Provides a simple type class for converting values of different string types into values of other string types.
 license:             BSD3
 license-file:        LICENSE
+tested-with:         GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.1, GHC == 8.0.1
 author:              Sönke Hahn
 maintainer:          soenkehahn@gmail.com
--- copyright:
 category:            Data
+homepage:            https://github.com/soenkehahn/string-conversions#readme
+bug-reports:         https://github.com/soenkehahn/string-conversions/issues
 build-type:          Simple
-cabal-version:       >=1.8
+cabal-version:       >= 1.10
 
 source-repository head
-  type:     git
-  location: https://github.com/soenkehahn/string-conversions.git
+  type: git
+  location: https://github.com/soenkehahn/string-conversions
 
 library
-  exposed-modules:     Data.String.Conversions,
-                       Data.String.Conversions.Monomorphic
+  hs-source-dirs:
+    src
+  default-language: Haskell2010
   build-depends:
-    base < 5,
+    base == 4.*,
     bytestring >= 0.9,
     text >= 0.11,
     utf8-string >= 0.3
-  ghc-options:
-    -Wall
+  exposed-modules:
+    Data.String.Conversions
+    Data.String.Conversions.Monomorphic
+  ghc-options: -Wall
+
+test-suite spec
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
+  hs-source-dirs:
+    test,
+    src
+  build-depends:
+    base == 4.*,
+    bytestring >= 0.9,
+    text >= 0.11,
+    utf8-string >= 0.3,
+    hspec,
+    quickcheck-instances,
+    deepseq,
+    QuickCheck
+  other-modules:
+    Data.String.ConversionsSpec
+    Data.String.Conversions
+    Data.String.Conversions.Monomorphic
+  default-language: Haskell2010
diff --git a/test/Data/String/ConversionsSpec.hs b/test/Data/String/ConversionsSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/String/ConversionsSpec.hs
@@ -0,0 +1,20 @@
+module Data.String.ConversionsSpec where
+
+import           Control.DeepSeq
+import           Test.Hspec
+import           Test.QuickCheck
+import           Test.QuickCheck.Instances ()
+
+import           Data.String.Conversions
+
+spec :: Spec
+spec = do
+  describe "cs" $ do
+    it "allows to convert from String to strict Text" $ do
+      property $ \ s ->
+        show (s :: String) `shouldBe` show (cs s :: ST)
+
+    context "when converting from strict ByteString to strict Text" $ do
+      it "never crashes" $ do
+        property $ \ s ->
+          deepseq (cs (s :: SBS) :: ST) (return () :: IO ())
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
