diff --git a/html/themes/Ocean/ocean.css b/html/themes/Ocean/ocean.css
index f671a1708b7835f482477bbc5628df960f1bf1a9..53af455f9b919205f9d2f0c7ce69ba6fb0f2b442 100644
--- a/html/themes/Ocean/ocean.css
+++ b/html/themes/Ocean/ocean.css
@@ -75,10 +75,20 @@ ul.links li a { padding: 5px 10px; }
 .clear { clear: both; }
 
 .collapser {
-  background: url(minus.gif) no-repeat 0 0.4em;
+  background-image: url(minus.gif);
+  background-repeat: no-repeat;
 }
 .expander {
-  background: url(plus.gif) no-repeat 0 0.4em;
+  background-image: url(plus.gif);
+  background-repeat: no-repeat;
+}
+span.module.collapser,
+span.module.expander {
+  background-position: 0 0.3em;
+}
+p.caption.collapser,
+p.caption.expander {
+  background-position: 0 0.4em;
 }
 .collapser, .expander {
   padding-left: 14px;
diff --git a/html/themes/Snappy/snappy.css b/html/themes/Snappy/snappy.css
index 52215f93ed395188018a4c49672797134f448174..d3d5bf8493e8e029aac8a348aeaf1074dc4006c2 100644
--- a/html/themes/Snappy/snappy.css
+++ b/html/themes/Snappy/snappy.css
@@ -142,13 +142,28 @@ ul.links li {
 
 .hide {	display: none; }
 .show { }
+
 .collapser {
-  background: url(minus.gif) no-repeat 0 17px;
+  background-image: url(minus.gif);
+  background-repeat: no-repeat;
 }
 .expander {
-  background: url(plus.gif) no-repeat 0 17px;
+  background-image: url(plus.gif);
+  background-repeat: no-repeat;
+}
+
+span.module.collapser,
+span.module.expander {
+  background-position: 0 6px;
+}
+p.caption.collapser,
+p.caption.expander {
+  background-position: 0 17px;
 }
-.subs .collapser, .subs .expander {
+#module-list .collapser,
+#module-list .expander,
+.subs p.caption.collapser,
+.subs p.caption.expander {
   padding-left: 14px;
   margin-left: -14px;
   cursor: pointer;
diff --git a/html/themes/Tibbe/tibbe.css b/html/themes/Tibbe/tibbe.css
index d92c269b00fe14f09cd01afd0e4c353a0db58888..886e32539e628389256350946319b9307669b677 100644
--- a/html/themes/Tibbe/tibbe.css
+++ b/html/themes/Tibbe/tibbe.css
@@ -227,11 +227,22 @@ dd {
 
 .hide {	display: none; }
 .show { }
+
 .collapser {
-  background: url(minus.gif) no-repeat 0 1.3em;
+  background-image: url(minus.gif);
+  background-repeat: no-repeat;
 }
 .expander {
-  background: url(plus.gif) no-repeat 0 1.3em;
+  background-image: url(plus.gif);
+  background-repeat: no-repeat;
+}
+span.module.collapser,
+span.module.expander {
+  background-position: 0 0.3em;
+}
+p.caption.collapser,
+p.caption.expander {
+  background-position: 0 1.3em;
 }
 .collapser, .expander {
   padding-left: 14px;
diff --git a/src/Haddock/Backends/Xhtml.hs b/src/Haddock/Backends/Xhtml.hs
index 94ee63478de3fd16eb11a59cad6c6de95e3d53be..7eb3180deea2d20d35a4200fda8879dc95c9e1a0 100644
--- a/src/Haddock/Backends/Xhtml.hs
+++ b/src/Haddock/Backends/Xhtml.hs
@@ -279,13 +279,13 @@ mkNodeList ss p ts = case ts of
 
 mkNode :: [String] -> String -> ModuleTree -> Html
 mkNode ss p (Node s leaf pkg short ts) =
-  collBtn +++ htmlModule +++ shortDescr +++ htmlPkg +++ subtree
+  htmlModule +++ shortDescr +++ htmlPkg +++ subtree
   where
-    collBtn = case ts of
-      [] -> noHtml
-      _ -> collapsebutton p
+    modAttrs = case ts of
+      [] -> [theclass "module"]
+      _ -> collapser p "module"
 
-    htmlModule = thespan ! [theclass "module" ] <<
+    htmlModule = thespan ! modAttrs <<
       (if leaf
         then ppModule (mkModule (stringToPackageId (fromMaybe "" pkg))
                                        (mkModuleName mdl))
@@ -297,7 +297,7 @@ mkNode ss p (Node s leaf pkg short ts) =
     shortDescr = maybe noHtml origDocToHtml short
     htmlPkg = maybe noHtml (thespan ! [theclass "package"] <<) pkg
 
-    subtree = mkNodeList (s:ss) p ts ! [identifier p]
+    subtree = mkNodeList (s:ss) p ts ! [identifier p, theclass "show"]
 
 
 -- | Turn a module tree into a flat list of full module names.  E.g.,
diff --git a/src/Haddock/Backends/Xhtml/Layout.hs b/src/Haddock/Backends/Xhtml/Layout.hs
index 3535ba0efd4df2dd4c1f361540fa481a33545c8e..9e45b812a3c882646176265fde83748fbb6e2db3 100644
--- a/src/Haddock/Backends/Xhtml/Layout.hs
+++ b/src/Haddock/Backends/Xhtml/Layout.hs
@@ -163,9 +163,7 @@ subInstances id_ = maybe noHtml wrap . instTable
     wrap = (subSection <<) . (subCaption +++)
     instTable = fmap (thediv ! [identifier id_, theclass "show"] <<) . subTable
     subSection = thediv ! [theclass $ "subs instances"]
-    subCaption = paragraph ! [theclass cs, onclick js] << "Instances"
-    cs = "caption collapser"
-    js = "toggleSection(this,'" ++ id_ ++ "')"
+    subCaption = paragraph ! collapser id_ "caption" << "Instances"
 
 
 subMethods :: [Html] -> Html
diff --git a/src/Haddock/Backends/Xhtml/Utils.hs b/src/Haddock/Backends/Xhtml/Utils.hs
index 61f0894d638ea2da7a62c2a9f3e8945f85e8f413..30abfdcdeef1e13abcca743a625f355468b8044d 100644
--- a/src/Haddock/Backends/Xhtml/Utils.hs
+++ b/src/Haddock/Backends/Xhtml/Utils.hs
@@ -25,7 +25,7 @@ module Haddock.Backends.Xhtml.Utils (
   hsep,
 
   onclick,
-  collapsebutton, collapseId,
+  collapser, collapseId,
 ) where
 
 
@@ -182,9 +182,11 @@ linkedAnchor n = anchor ! [href ('#':n)]
 -- below to a 'plusFile' and the 'display:block;' to a 'display:none;' when we
 -- use cookies from JavaScript to have a more persistent state.
 
-collapsebutton :: String -> Html
-collapsebutton id_ =
-  image ! [ src "minus.gif", theclass "coll", onclick ("toggle(this,'" ++ id_ ++ "')"), alt "show/hide" ]
+collapser :: String -> String -> [HtmlAttr]
+collapser id_ classes = [ theclass cs, onclick js ]
+  where
+    cs = unwords (words classes ++ ["collapser"])
+    js = "toggleSection(this,'" ++ id_ ++ "')"
 
 
 -- A quote is a valid part of a Haskell identifier, but it would interfere with