diff --git a/html/haddock-util.js b/html/haddock-util.js
index 372fd0e8d3589dba644f1511142f17f14a6cc031..155ee08f326420c06d18d27fa97eec957ac506f6 100644
--- a/html/haddock-util.js
+++ b/html/haddock-util.js
@@ -1,17 +1,26 @@
 // Haddock JavaScript utilities
-function toggle(button,id)
+
+function makeClassToggle(cOn, cOff)
+{
+  var rOn = new RegExp('\\b'+cOn+'\\b');
+  var rOff = new RegExp('\\b'+cOff+'\\b');
+    
+  return function(e, a) {
+    var c = e.className;
+    if (a == null) { a = rOff.test(c); }
+    if (a) { c = c.replace(rOff, cOn); }
+    else   { c = c.replace(rOn, cOff); }
+    e.className = c;
+  }
+}
+
+toggleClassShow = makeClassToggle("show", "hide");
+toggleClassCollapser = makeClassToggle("collapser", "expander");
+
+function toggleSection(toggler,id)
 {
-   var n = document.getElementById(id).style;
-   if (n.display == "none")
-   {
-    button.src = "minus.gif";
-    n.display = "block";
-   }
-   else
-   {
-    button.src = "plus.gif";
-    n.display = "none";
-   }
+  toggleClassShow(document.getElementById(id))
+  toggleClassCollapser(toggler);
 }
 
 
@@ -172,7 +181,6 @@ function resetStyle() {
 
 function styleMenu(show) {
   var m = document.getElementById('style-menu');
-  if (show == null) { show = m.className == "hide"; }
-  m.className = show ? "show" : "hide";
+  toggleClassShow(m, show);
 }
 
diff --git a/html/nhaddock.css b/html/nhaddock.css
index 393662ff9854244d367eb0cc1654e83c66a619f4..f671a1708b7835f482477bbc5628df960f1bf1a9 100644
--- a/html/nhaddock.css
+++ b/html/nhaddock.css
@@ -74,6 +74,18 @@ ul.links li a { padding: 5px 10px; }
 .show { display: inherit; }
 .clear { clear: both; }
 
+.collapser {
+  background: url(minus.gif) no-repeat 0 0.4em;
+}
+.expander {
+  background: url(plus.gif) no-repeat 0 0.4em;
+}
+.collapser, .expander {
+  padding-left: 14px;
+  margin-left: -14px;
+  cursor: pointer;
+}
+
 pre {
   padding: 0.5em;
   margin: 0.5em 5em 0.5em 3em;
diff --git a/html/shaddock.css b/html/shaddock.css
index 4af9b94bc4f09649d17439c93379f636f98ed351..52215f93ed395188018a4c49672797134f448174 100644
--- a/html/shaddock.css
+++ b/html/shaddock.css
@@ -142,6 +142,17 @@ ul.links li {
 
 .hide {	display: none; }
 .show { }
+.collapser {
+  background: url(minus.gif) no-repeat 0 17px;
+}
+.expander {
+  background: url(plus.gif) no-repeat 0 17px;
+}
+.subs .collapser, .subs .expander {
+  padding-left: 14px;
+  margin-left: -14px;
+  cursor: pointer;
+}
 
 /* Captions and Headers */
 
diff --git a/html/thaddock.css b/html/thaddock.css
index 102712f5a152125ca8b11d503e8977d0e4ba0aa7..d92c269b00fe14f09cd01afd0e4c353a0db58888 100644
--- a/html/thaddock.css
+++ b/html/thaddock.css
@@ -227,6 +227,17 @@ dd {
 
 .hide {	display: none; }
 .show { }
+.collapser {
+  background: url(minus.gif) no-repeat 0 1.3em;
+}
+.expander {
+  background: url(plus.gif) no-repeat 0 1.3em;
+}
+.collapser, .expander {
+  padding-left: 14px;
+  margin-left: -14px;
+  cursor: pointer;
+}
 
 .top {
     margin:0.4em 0 0 2em;
diff --git a/html/xhaddock.css b/html/xhaddock.css
index ee493d51b78c353d562907a62a2d7efadb3eeff3..35f4b469a0f975ecc7153cad4dfee903ba585900 100644
--- a/html/xhaddock.css
+++ b/html/xhaddock.css
@@ -100,6 +100,16 @@ ul.links li {
 
 .hide {	display: none; }
 .show { }
+.collapser {
+  background: url(minus.gif) no-repeat 0 0.3em;
+}
+.expander {
+  background: url(plus.gif) no-repeat 0 0.3em;
+}
+.collapser, .expander {
+  padding-left: 14px;
+  cursor: pointer;
+}
 
 #package-header {
 	color: #ffffff;
diff --git a/src/Haddock/Backends/Xhtml/Layout.hs b/src/Haddock/Backends/Xhtml/Layout.hs
index 499d058a388f18667e35956130c34d0e7c8b2922..3535ba0efd4df2dd4c1f361540fa481a33545c8e 100644
--- a/src/Haddock/Backends/Xhtml/Layout.hs
+++ b/src/Haddock/Backends/Xhtml/Layout.hs
@@ -158,10 +158,14 @@ subFields = divSubDecls "fields" "Fields" . subDlist
 
 
 subInstances :: String -> [SubDecl] -> Html
-subInstances id_ = divSubDecls "instances" instCaption . instTable
+subInstances id_ = maybe noHtml wrap . instTable
   where
-    instCaption = collapsebutton id_ +++ " Instances"
-    instTable = fmap (thediv ! [identifier id_] <<) . subTable
+    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_ ++ "')"
 
 
 subMethods :: [Html] -> Html