diff --git a/postie.cabal b/postie.cabal
--- a/postie.cabal
+++ b/postie.cabal
@@ -1,5 +1,5 @@
 name: postie
-version: 0.3.2.0
+version: 0.4.0.0
 cabal-version: >=1.10
 build-type: Simple
 license: BSD3
@@ -47,7 +47,7 @@
                    bytestring >=0.10.0.2, tls >=1.2.6, pipes >=4.1.0,
                    pipes-parse >=3.0.1, attoparsec >=0.10.4.0, transformers >=0.3.0.0,
                    mtl >=2.1.2, cprng-aes >=0.5.2, data-default-class >=0.0.1, uuid >= 1.3.3
-    exposed-modules: Web.Postie Web.Postie.Types Web.Postie.Settings Web.Postie.Address
+    exposed-modules: Web.Postie Web.Postie.Types Web.Postie.Settings Web.Postie.Address Web.Postie.SessionID
     exposed: True
     buildable: True
     default-language: Haskell2010
diff --git a/src/Web/Postie.hs b/src/Web/Postie.hs
--- a/src/Web/Postie.hs
+++ b/src/Web/Postie.hs
@@ -33,6 +33,7 @@
 import Web.Postie.Connection
 import Web.Postie.Types
 import Web.Postie.Session
+import Web.Postie.SessionID
 import Web.Postie.Pipes (UnexpectedEndOfInputException, TooMuchDataException)
 
 import Network (PortID (PortNumber), withSocketsDo, listenOn)
diff --git a/src/Web/Postie/Address.hs b/src/Web/Postie/Address.hs
--- a/src/Web/Postie/Address.hs
+++ b/src/Web/Postie/Address.hs
@@ -23,7 +23,7 @@
   deriving (Eq, Ord, Typeable)
 
 instance Show Address where
-  show = show . toByteString
+  show = BS.unpack . toByteString
 
 instance IsString Address where
   fromString = either (error "invalid email literal") id . parseOnly addrSpec . BS.pack
diff --git a/src/Web/Postie/Session.hs b/src/Web/Postie/Session.hs
--- a/src/Web/Postie/Session.hs
+++ b/src/Web/Postie/Session.hs
@@ -10,11 +10,11 @@
 import Web.Postie.Types
 import Web.Postie.Settings
 import Web.Postie.Connection
+import Web.Postie.SessionID
 import Web.Postie.Protocol (Event(..), Reply, reply, reply', renderReply)
 import qualified Web.Postie.Protocol as SMTP
 import Web.Postie.Pipes
 
-import Data.UUID.V4
 import qualified Data.ByteString.Char8 as BS
 
 import qualified Pipes.Parse as P
@@ -35,9 +35,6 @@
 data Transaction = TxnInitial
                  | TxnHaveMailFrom Address
                  | TxnHaveRecipient Address [Address]
-
-mkSessionID :: IO SessionID
-mkSessionID = SessionID `fmap` nextRandom
 
 runSession :: SessionID -> Settings -> Connection -> Application -> IO ()
 runSession sid settings connection app =
diff --git a/src/Web/Postie/SessionID.hs b/src/Web/Postie/SessionID.hs
new file mode 100644
--- /dev/null
+++ b/src/Web/Postie/SessionID.hs
@@ -0,0 +1,23 @@
+
+module Web.Postie.SessionID (
+    SessionID    -- | Unique session identifier
+  , mkSessionID  -- | Creates a SessionID
+  , toByteString -- | Converts SessionID to ByteString
+  ) where
+
+import Data.UUID (UUID, toString, toASCIIBytes)
+import Data.UUID.V4 (nextRandom)
+import Data.ByteString (ByteString)
+import Data.Typeable (Typeable)
+
+newtype SessionID = SessionID { toUUID :: UUID }
+  deriving (Eq, Ord, Typeable)
+
+instance Show SessionID where
+  show = toString . toUUID
+
+mkSessionID :: IO SessionID
+mkSessionID = SessionID `fmap` nextRandom
+
+toByteString :: SessionID -> ByteString
+toByteString = toASCIIBytes . toUUID
diff --git a/src/Web/Postie/Settings.hs b/src/Web/Postie/Settings.hs
--- a/src/Web/Postie/Settings.hs
+++ b/src/Web/Postie/Settings.hs
@@ -15,6 +15,7 @@
 
 import Web.Postie.Types
 import Web.Postie.Address
+import Web.Postie.SessionID
 import qualified Web.Postie.Connection as Connection
 
 import Network (HostName, PortID(..))
diff --git a/src/Web/Postie/Types.hs b/src/Web/Postie/Types.hs
--- a/src/Web/Postie/Types.hs
+++ b/src/Web/Postie/Types.hs
@@ -3,22 +3,14 @@
     HandlerResponse(..)
   , Mail(..)
   , Application
-  , SessionID(..)
   ) where
 
 import Web.Postie.Address
+import Web.Postie.SessionID (SessionID)
 
-import Data.UUID
-import Data.Typeable (Typeable)
 import Data.ByteString (ByteString)
 
 import Pipes (Producer)
-
-newtype SessionID = SessionID { toUUID :: UUID }
-  deriving (Eq, Ord, Typeable)
-
-instance Show SessionID where
-  show = show . toUUID
 
 -- | Handler response indicating validity of email transaction.
 data HandlerResponse = Accepted -- ^ Accepted, allow further processing.
