diff --git a/Web/PathPieces.hs b/Web/PathPieces.hs
--- a/Web/PathPieces.hs
+++ b/Web/PathPieces.hs
@@ -2,6 +2,8 @@
 module Web.PathPieces
     ( PathPiece (..)
     , PathMultiPiece (..)
+    , readFromPathPiece
+    , showToPathPiece
     -- * Deprecated
     , toSinglePiece
     , toMultiPiece
@@ -16,11 +18,16 @@
 import qualified Data.Text.Read
 import Data.Time (Day)
 import Control.Exception (assert)
+import Text.Read (readMaybe)
 
 class PathPiece s where
     fromPathPiece :: S.Text -> Maybe s
     toPathPiece :: s -> S.Text
 
+instance PathPiece () where
+    fromPathPiece t = if t == "_" then Just () else Nothing
+    toPathPiece () = "_"
+
 instance PathPiece String where
     fromPathPiece = Just . S.unpack
     toPathPiece = S.pack
@@ -121,6 +128,27 @@
 instance PathPiece a => PathMultiPiece [a] where
     fromPathMultiPiece = mapM fromPathPiece
     toPathMultiPiece = map toPathPiece
+
+-- | A function for helping generate free 'PathPiece'
+--   instances for enumeration data types 
+--   that have derived 'Read' and 'Show' instances.
+--   Intended to be used like this:
+--
+--   > data MyData = Foo | Bar | Baz
+--   >   deriving (Read,Show)
+--   > instance PathPiece MyData where
+--   >   fromPathPiece = readFromPathPiece
+--   >   toPathPiece = showToPathPiece
+--
+--  Since 0.2.1. 
+readFromPathPiece :: Read s => S.Text -> Maybe s
+readFromPathPiece = readMaybe . S.unpack
+
+-- | See the documentation for 'readFromPathPiece'.
+--
+--  Since 0.2.1. 
+showToPathPiece :: Show s => s -> S.Text
+showToPathPiece = S.pack . show
 
 {-# DEPRECATED toSinglePiece "Use toPathPiece instead of toSinglePiece" #-}
 toSinglePiece :: PathPiece p => p -> S.Text
diff --git a/path-pieces.cabal b/path-pieces.cabal
--- a/path-pieces.cabal
+++ b/path-pieces.cabal
@@ -1,5 +1,5 @@
 name:            path-pieces
-version:         0.2.0
+version:         0.2.1
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
