diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,1 +1,7 @@
-__3.0.0.3__ Support for time 1.5
+## 3.0.0.4
+
+Add missing trailing slashes [#312](https://github.com/yesodweb/wai/issues/312)
+
+## 3.0.0.3
+
+Support for time 1.5
diff --git a/Network/Wai/Application/Static.hs b/Network/Wai/Application/Static.hs
--- a/Network/Wai/Application/Static.hs
+++ b/Network/Wai/Application/Static.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TemplateHaskell, CPP #-}
 {-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE PatternGuards #-}
 -- | Static file serving for WAI.
 module Network.Wai.Application.Static
     ( -- * WAI application
@@ -74,14 +75,19 @@
 serveFolder ss@StaticSettings {..} pieces req folder@Folder {..} =
     -- first check if there is an index file in this folder
     case getFirst $ mconcat $ map (findIndex $ rights folderContents) ssIndices of
-        Just index -> do
-            let pieces' = setLast pieces index
-             in if ssRedirectToIndex
-                    then return $ Redirect pieces' Nothing
+        Just index ->
+            let pieces' = setLast pieces index in
+            case () of
+              () | ssRedirectToIndex -> return $ Redirect pieces' Nothing
+                 | noTrailingSlash pieces, Just trailing <- toPiece ""  ->
+                    return $ Redirect (pieces ++ [trailing]) Nothing
+                 | otherwise ->
                     -- start the checking process over, with a new set
-                    else checkPieces ss pieces' req
+                    checkPieces ss pieces' req
         Nothing ->
             case ssListing of
+                Just _ | noTrailingSlash pieces, Just trailing <- toPiece "" ->
+                    return $ Redirect (pieces ++ [trailing]) Nothing
                 Just listing -> do
                     -- directory listings turned on, display it
                     builder <- listing pieces folder
@@ -97,6 +103,11 @@
     setLast [t] x
         | fromPiece t == "" = [x]
     setLast (a:b) x = a : setLast b x
+
+    noTrailingSlash :: Pieces -> Bool
+    noTrailingSlash [] = False
+    noTrailingSlash [x] = fromPiece x /= ""
+    noTrailingSlash (_:xs) = noTrailingSlash xs
 
     findIndex :: [File] -> Piece -> First Piece
     findIndex files index
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,5 @@
+## wai-app-static
+
+WAI application for static serving
+
+Also provides some helper functions and datatypes for use outside of WAI.
diff --git a/wai-app-static.cabal b/wai-app-static.cabal
--- a/wai-app-static.cabal
+++ b/wai-app-static.cabal
@@ -1,11 +1,11 @@
 name:            wai-app-static
-version:         3.0.0.3
+version:         3.0.0.4
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
 maintainer:      Michael Snoyman <michael@snoyman.com>, Greg Weber <greg@gregweber.info>
 synopsis:        WAI application for static serving
-description:     Also provides some helper functions and datatypes for use outside of WAI.
+description:     Hackage documentation generation is not reliable. For up to date documentation, please see: <http://www.stackage.org/package/wai-app-static>.
 category:        Web, Yesod
 stability:       Stable
 cabal-version:   >= 1.8
@@ -17,6 +17,7 @@
   test/*.hs
   test/a/b
   tests.hs
+  README.md
   ChangeLog.md
 
 Flag print
