diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -21,7 +21,7 @@
 * Avoid writing custom functions
 * Export everything explicitly to provide a stable interface and for good documentation
 * Export only total functions or provide safe alternatives (Very few exceptions like div etc.)
-* Prefer Text over String, provide ConvertibleStrings
+* Prefer Text over String, provide ConvertString and EncodeString
 * Provide Monad transformers
 * Provide container types
 * Prefer generic functions
diff --git a/intro.cabal b/intro.cabal
--- a/intro.cabal
+++ b/intro.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           intro
-version:        0.2.0.0
+version:        0.2.0.1
 synopsis:       "Fixed Prelude" - Mostly total and safe, provides Text and Monad transformers
 description:    Intro is a modern Prelude which provides safe alternatives
                 for most of the partial functions and follows other
diff --git a/src/Intro/ConvertString.hs b/src/Intro/ConvertString.hs
--- a/src/Intro/ConvertString.hs
+++ b/src/Intro/ConvertString.hs
@@ -12,15 +12,15 @@
 --
 -----------------------------------------------------------------------------
 
-{-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE DeriveFoldable #-}
 {-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE DeriveTraversable #-}
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE NoImplicitPrelude #-}
 {-# LANGUAGE Safe #-}
-{-# LANGUAGE DefaultSignatures #-}
 
 module Intro.ConvertString (
     ConvertString(..)
@@ -28,6 +28,8 @@
   , Lenient(..)
 ) where
 
+import Control.DeepSeq (NFData)
+import Data.Binary (Binary)
 import Data.ByteString (ByteString)
 import Data.Either.Extra (eitherToMaybe)
 import Data.Eq (Eq)
@@ -41,8 +43,11 @@
 import Data.Text.Encoding.Error (lenientDecode)
 import Data.Traversable (Traversable)
 import Data.Word (Word8)
+import GHC.Generics (Generic, Generic1)
 import Text.Show (Show)
+import Text.Read (Read)
 import qualified Data.ByteString as B
+import qualified Data.ByteString.Short as S
 import qualified Data.ByteString.Lazy as BL
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as TE
@@ -52,7 +57,7 @@
 -- | Conversion of strings to other string types
 --
 -- @
--- ('convertString' :: b -> a)           . ('convertString' :: a -> b) ≡ ('id'      :: a -> a)
+-- ('convertString' :: b -> a)         . ('convertString' :: a -> b) ≡ ('id'      :: a -> a)
 -- ('convertString' :: b -> 'Maybe' a)   . ('convertString' :: a -> b) ≡ ('Just'    :: a -> 'Maybe' a)
 -- ('convertString' :: b -> 'Lenient' a) . ('convertString' :: a -> b) ≡ ('Lenient' :: a -> 'Lenient' a)
 -- @
@@ -89,60 +94,82 @@
 
 -- | Newtype wrapper for a string which was decoded leniently.
 newtype Lenient a = Lenient { getLenient :: a }
-  deriving (Eq, Ord, Show, Functor, Foldable, Traversable)
+  deriving (Eq, Ord, Read, Show, Functor, Foldable, Traversable, Generic, Generic1)
 
-instance ConvertString BL.ByteString (Lenient String)    where {-# INLINE convertString #-}; convertString = Lenient . TL.unpack . TLE.decodeUtf8With lenientDecode
-instance ConvertString BL.ByteString (Lenient TL.Text)   where {-# INLINE convertString #-}; convertString = Lenient . TLE.decodeUtf8With lenientDecode
-instance ConvertString BL.ByteString (Lenient Text)      where {-# INLINE convertString #-}; convertString = Lenient . TE.decodeUtf8With lenientDecode . BL.toStrict
-instance ConvertString BL.ByteString (Maybe   String)    where {-# INLINE convertString #-}; convertString = fmap TL.unpack . eitherToMaybe . TLE.decodeUtf8'
-instance ConvertString BL.ByteString (Maybe   TL.Text)   where {-# INLINE convertString #-}; convertString = eitherToMaybe . TLE.decodeUtf8'
-instance ConvertString BL.ByteString (Maybe   Text)      where {-# INLINE convertString #-}; convertString = eitherToMaybe . TE.decodeUtf8' . BL.toStrict
-instance ConvertString BL.ByteString BL.ByteString       where {-# INLINE convertString #-}; convertString = id
-instance ConvertString BL.ByteString ByteString          where {-# INLINE convertString #-}; convertString = BL.toStrict
-instance ConvertString BL.ByteString [Word8]             where {-# INLINE convertString #-}; convertString = BL.unpack
-instance ConvertString ByteString    (Lenient String)    where {-# INLINE convertString #-}; convertString = Lenient . T.unpack . TE.decodeUtf8With lenientDecode
-instance ConvertString ByteString    (Lenient TL.Text)   where {-# INLINE convertString #-}; convertString = Lenient . TLE.decodeUtf8With lenientDecode . BL.fromStrict
-instance ConvertString ByteString    (Lenient Text)      where {-# INLINE convertString #-}; convertString = Lenient . TE.decodeUtf8With lenientDecode
-instance ConvertString ByteString    (Maybe   String)    where {-# INLINE convertString #-}; convertString = fmap T.unpack . eitherToMaybe . TE.decodeUtf8'
-instance ConvertString ByteString    (Maybe   TL.Text)   where {-# INLINE convertString #-}; convertString = eitherToMaybe . TLE.decodeUtf8' . BL.fromStrict
-instance ConvertString ByteString    (Maybe   Text)      where {-# INLINE convertString #-}; convertString = eitherToMaybe . TE.decodeUtf8'
-instance ConvertString ByteString    BL.ByteString       where {-# INLINE convertString #-}; convertString = BL.fromStrict
-instance ConvertString ByteString    ByteString          where {-# INLINE convertString #-}; convertString = id
-instance ConvertString ByteString    [Word8]             where {-# INLINE convertString #-}; convertString = B.unpack
-instance ConvertString String        BL.ByteString       where {-# INLINE convertString #-}; convertString = TLE.encodeUtf8 . TL.pack
-instance ConvertString String        ByteString          where {-# INLINE convertString #-}; convertString = TE.encodeUtf8 . T.pack
-instance ConvertString String        String              where {-# INLINE convertString #-}; convertString = id
-instance ConvertString String        TL.Text             where {-# INLINE convertString #-}; convertString = TL.pack
-instance ConvertString String        Text                where {-# INLINE convertString #-}; convertString = T.pack
-instance ConvertString String        [Word8]             where {-# INLINE convertString #-}; convertString = BL.unpack . TLE.encodeUtf8 . TL.pack
-instance ConvertString TL.Text       BL.ByteString       where {-# INLINE convertString #-}; convertString = TLE.encodeUtf8
-instance ConvertString TL.Text       ByteString          where {-# INLINE convertString #-}; convertString = BL.toStrict . TLE.encodeUtf8
-instance ConvertString TL.Text       String              where {-# INLINE convertString #-}; convertString = TL.unpack
-instance ConvertString TL.Text       TL.Text             where {-# INLINE convertString #-}; convertString = id
-instance ConvertString TL.Text       Text                where {-# INLINE convertString #-}; convertString = TL.toStrict
-instance ConvertString TL.Text       [Word8]             where {-# INLINE convertString #-}; convertString = BL.unpack . TLE.encodeUtf8
-instance ConvertString Text          BL.ByteString       where {-# INLINE convertString #-}; convertString = BL.fromStrict . TE.encodeUtf8
-instance ConvertString Text          ByteString          where {-# INLINE convertString #-}; convertString = TE.encodeUtf8
-instance ConvertString Text          String              where {-# INLINE convertString #-}; convertString = T.unpack
-instance ConvertString Text          TL.Text             where {-# INLINE convertString #-}; convertString = TL.fromStrict
-instance ConvertString Text          Text                where {-# INLINE convertString #-}; convertString = id
-instance ConvertString Text          [Word8]             where {-# INLINE convertString #-}; convertString = BL.unpack . BL.fromStrict . TE.encodeUtf8
-instance ConvertString [Word8]       (Lenient String)    where {-# INLINE convertString #-}; convertString = Lenient . TL.unpack . TLE.decodeUtf8With lenientDecode . BL.pack
-instance ConvertString [Word8]       (Lenient TL.Text)   where {-# INLINE convertString #-}; convertString = Lenient . TLE.decodeUtf8With lenientDecode . BL.pack
-instance ConvertString [Word8]       (Lenient Text)      where {-# INLINE convertString #-}; convertString = Lenient . TE.decodeUtf8With lenientDecode . B.pack
-instance ConvertString [Word8]       (Maybe String)      where {-# INLINE convertString #-}; convertString = fmap TL.unpack . eitherToMaybe . TLE.decodeUtf8' . BL.pack
-instance ConvertString [Word8]       (Maybe TL.Text)     where {-# INLINE convertString #-}; convertString = eitherToMaybe . TLE.decodeUtf8' . BL.pack
-instance ConvertString [Word8]       (Maybe Text)        where {-# INLINE convertString #-}; convertString = eitherToMaybe . TE.decodeUtf8' . B.pack
-instance ConvertString [Word8]       BL.ByteString       where {-# INLINE convertString #-}; convertString = BL.pack
-instance ConvertString [Word8]       ByteString          where {-# INLINE convertString #-}; convertString = B.pack
-instance ConvertString [Word8]       [Word8]             where {-# INLINE convertString #-}; convertString = id
+instance Binary a => Binary (Lenient a)
+instance NFData a => NFData (Lenient a)
 
-instance EncodeString  String        BL.ByteString
-instance EncodeString  String        ByteString
-instance EncodeString  String        [Word8]
-instance EncodeString  TL.Text       BL.ByteString
-instance EncodeString  TL.Text       ByteString
-instance EncodeString  TL.Text       [Word8]
-instance EncodeString  Text          BL.ByteString
-instance EncodeString  Text          ByteString
-instance EncodeString  Text          [Word8]
+instance ConvertString BL.ByteString     (Lenient String)  where {-# INLINE convertString #-}; convertString = Lenient . TL.unpack . TLE.decodeUtf8With lenientDecode
+instance ConvertString BL.ByteString     (Lenient TL.Text) where {-# INLINE convertString #-}; convertString = Lenient . TLE.decodeUtf8With lenientDecode
+instance ConvertString BL.ByteString     (Lenient Text)    where {-# INLINE convertString #-}; convertString = Lenient . TE.decodeUtf8With lenientDecode . BL.toStrict
+instance ConvertString BL.ByteString     (Maybe   String)  where {-# INLINE convertString #-}; convertString = fmap TL.unpack . eitherToMaybe . TLE.decodeUtf8'
+instance ConvertString BL.ByteString     (Maybe   TL.Text) where {-# INLINE convertString #-}; convertString = eitherToMaybe . TLE.decodeUtf8'
+instance ConvertString BL.ByteString     (Maybe   Text)    where {-# INLINE convertString #-}; convertString = eitherToMaybe . TE.decodeUtf8' . BL.toStrict
+instance ConvertString BL.ByteString     BL.ByteString     where {-# INLINE convertString #-}; convertString = id
+instance ConvertString BL.ByteString     ByteString        where {-# INLINE convertString #-}; convertString = BL.toStrict
+instance ConvertString BL.ByteString     S.ShortByteString where {-# INLINE convertString #-}; convertString = S.toShort . BL.toStrict
+instance ConvertString BL.ByteString     [Word8]           where {-# INLINE convertString #-}; convertString = BL.unpack
+instance ConvertString ByteString        (Lenient String)  where {-# INLINE convertString #-}; convertString = Lenient . T.unpack . TE.decodeUtf8With lenientDecode
+instance ConvertString ByteString        (Lenient TL.Text) where {-# INLINE convertString #-}; convertString = Lenient . TLE.decodeUtf8With lenientDecode . BL.fromStrict
+instance ConvertString ByteString        (Lenient Text)    where {-# INLINE convertString #-}; convertString = Lenient . TE.decodeUtf8With lenientDecode
+instance ConvertString ByteString        (Maybe   String)  where {-# INLINE convertString #-}; convertString = fmap T.unpack . eitherToMaybe . TE.decodeUtf8'
+instance ConvertString ByteString        (Maybe   TL.Text) where {-# INLINE convertString #-}; convertString = eitherToMaybe . TLE.decodeUtf8' . BL.fromStrict
+instance ConvertString ByteString        (Maybe   Text)    where {-# INLINE convertString #-}; convertString = eitherToMaybe . TE.decodeUtf8'
+instance ConvertString ByteString        BL.ByteString     where {-# INLINE convertString #-}; convertString = BL.fromStrict
+instance ConvertString ByteString        ByteString        where {-# INLINE convertString #-}; convertString = id
+instance ConvertString ByteString        S.ShortByteString where {-# INLINE convertString #-}; convertString = S.toShort
+instance ConvertString ByteString        [Word8]           where {-# INLINE convertString #-}; convertString = B.unpack
+instance ConvertString S.ShortByteString (Lenient String)  where {-# INLINE convertString #-}; convertString = Lenient . T.unpack . TE.decodeUtf8With lenientDecode . S.fromShort
+instance ConvertString S.ShortByteString (Lenient TL.Text) where {-# INLINE convertString #-}; convertString = Lenient . TLE.decodeUtf8With lenientDecode . BL.fromStrict . S.fromShort
+instance ConvertString S.ShortByteString (Lenient Text)    where {-# INLINE convertString #-}; convertString = Lenient . TE.decodeUtf8With lenientDecode . S.fromShort
+instance ConvertString S.ShortByteString (Maybe   String)  where {-# INLINE convertString #-}; convertString = fmap T.unpack . eitherToMaybe . TE.decodeUtf8' . S.fromShort
+instance ConvertString S.ShortByteString (Maybe   TL.Text) where {-# INLINE convertString #-}; convertString = eitherToMaybe . TLE.decodeUtf8' . BL.fromStrict . S.fromShort
+instance ConvertString S.ShortByteString (Maybe   Text)    where {-# INLINE convertString #-}; convertString = eitherToMaybe . TE.decodeUtf8' . S.fromShort
+instance ConvertString S.ShortByteString BL.ByteString     where {-# INLINE convertString #-}; convertString = BL.fromStrict . S.fromShort
+instance ConvertString S.ShortByteString ByteString        where {-# INLINE convertString #-}; convertString = S.fromShort
+instance ConvertString S.ShortByteString S.ShortByteString where {-# INLINE convertString #-}; convertString = id
+instance ConvertString S.ShortByteString [Word8]           where {-# INLINE convertString #-}; convertString = S.unpack
+instance ConvertString String            BL.ByteString     where {-# INLINE convertString #-}; convertString = TLE.encodeUtf8 . TL.pack
+instance ConvertString String            ByteString        where {-# INLINE convertString #-}; convertString = TE.encodeUtf8 . T.pack
+instance ConvertString String            S.ShortByteString where {-# INLINE convertString #-}; convertString = S.toShort . TE.encodeUtf8 . T.pack
+instance ConvertString String            String            where {-# INLINE convertString #-}; convertString = id
+instance ConvertString String            TL.Text           where {-# INLINE convertString #-}; convertString = TL.pack
+instance ConvertString String            Text              where {-# INLINE convertString #-}; convertString = T.pack
+instance ConvertString String            [Word8]           where {-# INLINE convertString #-}; convertString = BL.unpack . TLE.encodeUtf8 . TL.pack
+instance ConvertString TL.Text           BL.ByteString     where {-# INLINE convertString #-}; convertString = TLE.encodeUtf8
+instance ConvertString TL.Text           ByteString        where {-# INLINE convertString #-}; convertString = BL.toStrict . TLE.encodeUtf8
+instance ConvertString TL.Text           S.ShortByteString where {-# INLINE convertString #-}; convertString = S.toShort . BL.toStrict . TLE.encodeUtf8
+instance ConvertString TL.Text           String            where {-# INLINE convertString #-}; convertString = TL.unpack
+instance ConvertString TL.Text           TL.Text           where {-# INLINE convertString #-}; convertString = id
+instance ConvertString TL.Text           Text              where {-# INLINE convertString #-}; convertString = TL.toStrict
+instance ConvertString TL.Text           [Word8]           where {-# INLINE convertString #-}; convertString = BL.unpack . TLE.encodeUtf8
+instance ConvertString Text              BL.ByteString     where {-# INLINE convertString #-}; convertString = BL.fromStrict . TE.encodeUtf8
+instance ConvertString Text              ByteString        where {-# INLINE convertString #-}; convertString = TE.encodeUtf8
+instance ConvertString Text              S.ShortByteString where {-# INLINE convertString #-}; convertString = S.toShort . TE.encodeUtf8
+instance ConvertString Text              String            where {-# INLINE convertString #-}; convertString = T.unpack
+instance ConvertString Text              TL.Text           where {-# INLINE convertString #-}; convertString = TL.fromStrict
+instance ConvertString Text              Text              where {-# INLINE convertString #-}; convertString = id
+instance ConvertString Text              [Word8]           where {-# INLINE convertString #-}; convertString = BL.unpack . BL.fromStrict . TE.encodeUtf8
+instance ConvertString [Word8]           (Lenient String)  where {-# INLINE convertString #-}; convertString = Lenient . TL.unpack . TLE.decodeUtf8With lenientDecode . BL.pack
+instance ConvertString [Word8]           (Lenient TL.Text) where {-# INLINE convertString #-}; convertString = Lenient . TLE.decodeUtf8With lenientDecode . BL.pack
+instance ConvertString [Word8]           (Lenient Text)    where {-# INLINE convertString #-}; convertString = Lenient . TE.decodeUtf8With lenientDecode . B.pack
+instance ConvertString [Word8]           (Maybe String)    where {-# INLINE convertString #-}; convertString = fmap TL.unpack . eitherToMaybe . TLE.decodeUtf8' . BL.pack
+instance ConvertString [Word8]           (Maybe TL.Text)   where {-# INLINE convertString #-}; convertString = eitherToMaybe . TLE.decodeUtf8' . BL.pack
+instance ConvertString [Word8]           (Maybe Text)      where {-# INLINE convertString #-}; convertString = eitherToMaybe . TE.decodeUtf8' . B.pack
+instance ConvertString [Word8]           BL.ByteString     where {-# INLINE convertString #-}; convertString = BL.pack
+instance ConvertString [Word8]           ByteString        where {-# INLINE convertString #-}; convertString = B.pack
+instance ConvertString [Word8]           S.ShortByteString where {-# INLINE convertString #-}; convertString = S.pack
+instance ConvertString [Word8]           [Word8]           where {-# INLINE convertString #-}; convertString = id
+
+instance EncodeString  String            BL.ByteString
+instance EncodeString  String            ByteString
+instance EncodeString  String            S.ShortByteString
+instance EncodeString  String            [Word8]
+instance EncodeString  TL.Text           BL.ByteString
+instance EncodeString  TL.Text           ByteString
+instance EncodeString  TL.Text           S.ShortByteString
+instance EncodeString  TL.Text           [Word8]
+instance EncodeString  Text              BL.ByteString
+instance EncodeString  Text              ByteString
+instance EncodeString  Text              S.ShortByteString
+instance EncodeString  Text              [Word8]
diff --git a/test/test.hs b/test/test.hs
--- a/test/test.hs
+++ b/test/test.hs
@@ -5,8 +5,9 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 module Main where
 
-import Intro
 import BaseCompat ()
+import Data.ByteString.Short (ShortByteString)
+import Intro
 import LensCompat ()
 import Test.QuickCheck
 import Test.QuickCheck.Instances ()
@@ -15,18 +16,23 @@
 main = do
   encode (Proxy :: Proxy LText)       (Proxy :: Proxy ByteString)
   encode (Proxy :: Proxy LText)       (Proxy :: Proxy LByteString)
+  encode (Proxy :: Proxy LText)       (Proxy :: Proxy ShortByteString)
   encode (Proxy :: Proxy LText)       (Proxy :: Proxy [Word8])
   encode (Proxy :: Proxy String)      (Proxy :: Proxy ByteString)
   encode (Proxy :: Proxy String)      (Proxy :: Proxy LByteString)
+  encode (Proxy :: Proxy String)      (Proxy :: Proxy ShortByteString)
   encode (Proxy :: Proxy String)      (Proxy :: Proxy [Word8])
   encode (Proxy :: Proxy Text)        (Proxy :: Proxy ByteString)
   encode (Proxy :: Proxy Text)        (Proxy :: Proxy LByteString)
+  encode (Proxy :: Proxy Text)        (Proxy :: Proxy ShortByteString)
   encode (Proxy :: Proxy Text)        (Proxy :: Proxy [Word8])
   iso    (Proxy :: Proxy ByteString)  (Proxy :: Proxy ByteString)
   iso    (Proxy :: Proxy ByteString)  (Proxy :: Proxy LByteString)
+  iso    (Proxy :: Proxy ByteString)  (Proxy :: Proxy ShortByteString)
   iso    (Proxy :: Proxy ByteString)  (Proxy :: Proxy [Word8])
   iso    (Proxy :: Proxy LByteString) (Proxy :: Proxy ByteString)
   iso    (Proxy :: Proxy LByteString) (Proxy :: Proxy LByteString)
+  iso    (Proxy :: Proxy LByteString) (Proxy :: Proxy ShortByteString)
   iso    (Proxy :: Proxy LByteString) (Proxy :: Proxy [Word8])
   iso    (Proxy :: Proxy LText)       (Proxy :: Proxy LText)
   iso    (Proxy :: Proxy LText)       (Proxy :: Proxy String)
@@ -39,6 +45,7 @@
   iso    (Proxy :: Proxy Text)        (Proxy :: Proxy Text)
   iso    (Proxy :: Proxy [Word8])     (Proxy :: Proxy ByteString)
   iso    (Proxy :: Proxy [Word8])     (Proxy :: Proxy LByteString)
+  iso    (Proxy :: Proxy [Word8])     (Proxy :: Proxy ShortByteString)
   iso    (Proxy :: Proxy [Word8])     (Proxy :: Proxy [Word8])
 
 iso :: forall a b proxy. (Eq a, Show a, Arbitrary a, ConvertString a b, ConvertString b a) => proxy a -> proxy b -> IO ()
