diff --git a/Data/Object.hs b/Data/Object.hs
--- a/Data/Object.hs
+++ b/Data/Object.hs
@@ -3,7 +3,7 @@
 {-# LANGUAGE OverlappingInstances #-}
 ---------------------------------------------------------
 --
--- Module        : Web.ClientSession
+-- Module        : Data.Object
 -- Copyright     : Michael Snoyman
 -- License       : BSD3
 --
@@ -21,12 +21,15 @@
     ( Object (..)
     , FromObject (..)
     , ToObject (..)
+    , FromScalar (..)
+    , ToScalar (..)
     , oLookup
     ) where
 
 import qualified Data.ByteString as B
 import Data.ByteString.Class
 import Control.Arrow
+import Data.Time.Calendar
 
 data Object =
     Mapping [(B.ByteString, Object)]
@@ -36,26 +39,36 @@
 
 class ToObject a where
     toObject :: a -> Object
-
 class FromObject a where
     fromObject :: Monad m => Object -> m a
 
-bsFromObject :: (Monad m, StrictByteString bs) => Object -> m bs
-bsFromObject (Scalar bs) = return $ fromStrictByteString bs
-bsFromObject _ = fail "Attempt to extract a scalar from non-scalar"
-
-instance ToObject String where
-    toObject = Scalar . toStrictByteString
+class ToObject a => ToScalar a where
+    toScalar :: a -> B.ByteString
+class FromObject a => FromScalar a where
+    fromScalar :: Monad m => B.ByteString -> m a
 
-instance FromObject String where
-    fromObject = bsFromObject
+bsFromObject :: Monad m => Object -> m B.ByteString
+bsFromObject (Scalar s) = return s
+bsFromObject _ = fail "Attempt to extract a scalar from non-scalar"
 
+instance ToScalar B.ByteString where
+    toScalar = id
+instance FromScalar B.ByteString where
+    fromScalar = return
 instance ToObject B.ByteString where
     toObject = Scalar
-
 instance FromObject B.ByteString where
     fromObject = bsFromObject
 
+instance ToScalar String where
+    toScalar = toStrictByteString
+instance FromScalar String where
+    fromScalar = return . fromStrictByteString
+instance ToObject String where
+    toObject = Scalar . toScalar
+instance FromObject String where
+    fromObject o = fromObject o >>= fromScalar
+
 instance ToObject o => ToObject [o] where
     toObject = Sequence . map toObject
 
@@ -63,12 +76,12 @@
     fromObject (Sequence os) = mapM fromObject os
     fromObject _ = fail "Attempt to extract a sequence from non-sequence"
 
-instance (StrictByteString bs, ToObject o) => ToObject [(bs, o)] where
-    toObject = Mapping . map (toStrictByteString *** toObject)
+instance (ToScalar bs, ToObject o) => ToObject [(bs, o)] where
+    toObject = Mapping . map (toScalar *** toObject)
 
-instance (StrictByteString bs, FromObject o) => FromObject [(bs, o)] where
+instance (FromScalar bs, FromObject o) => FromObject [(bs, o)] where
     fromObject (Mapping pairs) =
-        mapM (liftSnd . (fromStrictByteString *** fromObject)) pairs
+        mapM (liftPair . (fromScalar *** fromObject)) pairs
     fromObject _ = fail "Attempt to extract a mapping from non-mapping"
 
 instance ToObject Object where
@@ -77,8 +90,11 @@
 instance FromObject Object where
     fromObject = return
 
-liftSnd :: Monad m => (a, m b) -> m (a, b)
-liftSnd (a, b) = b >>= \b' -> return (a, b')
+liftPair :: Monad m => (m a, m b) -> m (a, b)
+liftPair (a, b) = do
+    a' <- a
+    b' <- b
+    return (a', b')
 
 oLookup :: (Monad m, Eq a, Show a, FromObject b)
         => a -- ^ key
@@ -88,3 +104,27 @@
     case lookup key pairs of
         Nothing -> fail $ "Key not found: " ++ show key
         Just x -> fromObject x
+
+-- helper
+readM :: (Read r, Monad m) => String -> m r
+readM s = case reads s of
+            ((x, _):_) -> return x
+            _ -> fail $ "Unable to read: " ++ s
+-- instances
+
+instance ToScalar Day where
+    toScalar = toStrictByteString . show
+instance ToObject Day where
+    toObject = toObject . toScalar
+instance FromScalar Day where
+    fromScalar bs = do
+        let s = fromStrictByteString bs
+        if length s /= 10
+            then fail ("Invalid day: " ++ s)
+            else do
+                y <- readM $ take 4 s
+                m <- readM $ take 2 $ drop 5 s
+                d <- readM $ take 2 $ drop 8 s
+                return $ fromGregorian y m d
+instance FromObject Day where
+    fromObject o = fromObject o >>= fromScalar
diff --git a/data-object.cabal b/data-object.cabal
--- a/data-object.cabal
+++ b/data-object.cabal
@@ -1,5 +1,5 @@
 name:            data-object
-version:         0.0.0
+version:         0.0.1
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -18,6 +18,7 @@
 library
     build-depends:   base >= 4 && < 5,
                      bytestring-class,
-                     bytestring >= 0.9.1.4 && < 1
+                     bytestring >= 0.9.1.4 && < 1,
+                     time >= 1
     exposed-modules: Data.Object
     ghc-options:     -Wall
