diff --git a/Web/Cookie.hs b/Web/Cookie.hs
--- a/Web/Cookie.hs
+++ b/Web/Cookie.hs
@@ -1,9 +1,20 @@
 {-# LANGUAGE OverloadedStrings #-}
 module Web.Cookie
     ( -- * Server to client
-      SetCookie (..)
+      -- ** Data type
+      SetCookie
+    , setCookieName
+    , setCookieValue
+    , setCookiePath
+    , setCookieExpires
+    , setCookieMaxAge
+    , setCookieDomain
+    , setCookieHttpOnly
+    , setCookieSecure
+      -- ** Functions
     , parseSetCookie
     , renderSetCookie
+    , def
       -- * Client to server
     , Cookies
     , parseCookies
@@ -25,7 +36,9 @@
 import Blaze.ByteString.Builder.Char8 (fromChar)
 import Data.Monoid (mempty, mappend, mconcat)
 import Data.Word (Word8)
+import Data.Ratio (numerator, denominator)
 import Data.Time (UTCTime, formatTime, parseTime)
+import Data.Time.Clock (DiffTime, secondsToDiffTime)
 import System.Locale (defaultTimeLocale)
 import Control.Arrow (first)
 import Data.Text (Text)
@@ -33,6 +46,7 @@
 import Data.Text.Encoding.Error (lenientDecode)
 import Control.Arrow ((***))
 import Data.Maybe (isJust)
+import Data.Default (Default (def))
 
 -- | Textual cookies. Functions assume UTF8 encoding.
 type CookiesText = [(Text, Text)]
@@ -84,11 +98,25 @@
     , setCookieValue :: S.ByteString
     , setCookiePath :: Maybe S.ByteString
     , setCookieExpires :: Maybe UTCTime
+    , setCookieMaxAge :: Maybe DiffTime
     , setCookieDomain :: Maybe S.ByteString
     , setCookieHttpOnly :: Bool
+    , setCookieSecure :: Bool
     }
-    deriving (Eq, Show, Read)
+    deriving (Eq, Show)
 
+instance Default SetCookie where
+    def = SetCookie
+        { setCookieName     = "name"
+        , setCookieValue    = "value"
+        , setCookiePath     = Nothing
+        , setCookieExpires  = Nothing
+        , setCookieMaxAge   = Nothing
+        , setCookieDomain   = Nothing
+        , setCookieHttpOnly = False
+        , setCookieSecure   = False
+        }
+
 renderSetCookie :: SetCookie -> Builder
 renderSetCookie sc = mconcat
     [ fromByteString (setCookieName sc)
@@ -96,19 +124,26 @@
     , fromByteString (setCookieValue sc)
     , case setCookiePath sc of
         Nothing -> mempty
-        Just path -> copyByteString "; path="
+        Just path -> copyByteString "; Path="
                      `mappend` fromByteString path
     , case setCookieExpires sc of
         Nothing -> mempty
-        Just e -> copyByteString "; expires=" `mappend`
+        Just e -> copyByteString "; Expires=" `mappend`
                   fromByteString (formatCookieExpires e)
+    , case setCookieMaxAge sc of
+        Nothing -> mempty
+        Just ma -> copyByteString"; Max-Age=" `mappend`
+                   fromByteString (formatCookieMaxAge ma)
     , case setCookieDomain sc of
         Nothing -> mempty
-        Just d -> copyByteString "; domain=" `mappend`
+        Just d -> copyByteString "; Domain=" `mappend`
                   fromByteString d
     , if setCookieHttpOnly sc
         then copyByteString "; HttpOnly"
         else mempty
+    , if setCookieSecure sc
+        then copyByteString "; Secure"
+        else mempty
     ]
 
 parseSetCookie :: S.ByteString -> SetCookie
@@ -118,8 +153,11 @@
     , setCookiePath = lookup "path" pairs
     , setCookieExpires =
         lookup "expires" pairs >>= parseCookieExpires
+    , setCookieMaxAge =
+        lookup "max-age" pairs >>= parseCookieMaxAge
     , setCookieDomain = lookup "domain" pairs
-    , setCookieHttpOnly = isJust $ lookup "HttpOnly" pairs
+    , setCookieHttpOnly = isJust $ lookup "httponly" pairs
+    , setCookieSecure = isJust $ lookup "secure" pairs
     }
   where
     (key, value, b) = parsePair a
@@ -144,3 +182,16 @@
 
 parseCookieExpires :: S.ByteString -> Maybe UTCTime
 parseCookieExpires = parseTime defaultTimeLocale expiresFormat . S8.unpack
+
+-- | Format a 'DiffTime' for a cookie.
+formatCookieMaxAge :: DiffTime -> S.ByteString
+formatCookieMaxAge difftime = S8.pack $ show (num `div` denom)
+  where rational = toRational difftime
+        num = numerator rational
+        denom = denominator rational
+
+parseCookieMaxAge :: S.ByteString -> Maybe DiffTime
+parseCookieMaxAge bs
+  | all (\ c -> c >= '0' && c <= '9') $ unpacked = Just $ secondsToDiffTime $ read unpacked
+  | otherwise = Nothing
+  where unpacked = S8.unpack bs
diff --git a/cookie.cabal b/cookie.cabal
--- a/cookie.cabal
+++ b/cookie.cabal
@@ -1,5 +1,5 @@
 name:            cookie
-version:         0.3.0.2
+version:         0.4.0
 license:         BSD3
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
@@ -18,6 +18,7 @@
                    , old-locale                >= 1        && < 1.1
                    , time                      >= 1.1.4
                    , text                      >= 0.7      && < 1.0
+                   , data-default
     exposed-modules: Web.Cookie
     ghc-options:     -Wall
 
