diff --git a/haphviz.cabal b/haphviz.cabal
--- a/haphviz.cabal
+++ b/haphviz.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                haphviz
-version:             0.1.2.1
+version:             0.2.0.0
 synopsis:            Graphviz code generation with Haskell
 description:
   There are multiple ways to describe this package:
diff --git a/src/Text/Dot/Gen.hs b/src/Text/Dot/Gen.hs
--- a/src/Text/Dot/Gen.hs
+++ b/src/Text/Dot/Gen.hs
@@ -228,23 +228,23 @@
 -- | Cluster with a given name
 --
 -- The @cluster_@ prefix is taken care of.
-cluster :: Text -> DotGen () -> DotGen GraphName
+cluster :: Text -> DotGen a -> DotGen (GraphName, a)
 cluster name = subgraph $ "cluster_" <> name
 
 -- | Like 'cluster', discarding the graph name.
-cluster_ :: Text -> DotGen () -> DotGen ()
-cluster_ name subgraph = void $ cluster name subgraph
+cluster_ :: Text -> DotGen a -> DotGen a
+cluster_ name subgraph = snd <$> cluster name subgraph
 
 -- | Subgraph declaration
 --
 -- This is rarely useful. Just use 'cluster'.
-subgraph :: Text -> DotGen () -> DotGen GraphName
+subgraph :: Text -> DotGen a -> DotGen (GraphName, a)
 subgraph name content = do
     n <- get
-    let (((), newn), dot) = genSubDot' n content
+    let ((a, newn), dot) = genSubDot' n content
     tell $ Subgraph name dot
     put newn
-    return name
+    return (name, a)
 
 -- * Miscelaneous
 -- ** Rankdir
diff --git a/src/Text/Dot/Render.hs b/src/Text/Dot/Render.hs
--- a/src/Text/Dot/Render.hs
+++ b/src/Text/Dot/Render.hs
@@ -149,7 +149,7 @@
 renderDecType :: DecType -> Render ()
 renderDecType DecGraph = tell "graph"
 renderDecType DecNode  = tell "node"
-renderDotType DecEdge  = tell "edge"
+renderDecType DecEdge  = tell "edge"
 
 renderRankDirType :: RankdirType -> Render ()
 renderRankDirType TB = tell "TB"
