diff --git a/ghc-datasize.cabal b/ghc-datasize.cabal
--- a/ghc-datasize.cabal
+++ b/ghc-datasize.cabal
@@ -1,5 +1,5 @@
 name:               ghc-datasize
-version:            0.1
+version:            0.1.1
 license:            BSD3
 license-file:       LICENSE
 category:           GHC, Debug, Development
@@ -21,7 +21,8 @@
   Exposed-modules: GHC.DataSize
   Default-Language: Haskell2010
   Build-depends: base == 4.*,
-                 ghc-heap-view >= 0.3.0.3
+                 --containers,
+                 ghc-heap-view >= 0.5
   Hs-source-dirs: src/
   Ghc-options: -Wall
 
diff --git a/src/GHC/DataSize.hs b/src/GHC/DataSize.hs
--- a/src/GHC/DataSize.hs
+++ b/src/GHC/DataSize.hs
@@ -7,6 +7,7 @@
 module GHC.DataSize (
   closureSize,
   recursiveSize
+  --mSize
   )
   where
 
@@ -18,6 +19,11 @@
 
 import System.Mem
 
+--import qualified Data.IntMap as IntMap
+
+--depth :: Int
+--depth = 10^10
+
 -- Inspired by Simon Marlow:
 -- https://ghcmutterings.wordpress.com/2009/02/12/53/
 
@@ -41,18 +47,21 @@
 --   @
 --    recursiveSize $!! \"foobar\"
 --   @
---   ($!! from Control.DeepSeq) to force full evaluation before calulating the size.
+--   ($!! from Control.DeepSeq) to force full evaluation before calculating the
+--   size.
 --
 --   A garbage collection is performed before the size is calculated, because
 --   the garbage collector would make heap walks difficult.
+
 recursiveSize :: Num b => a -> IO b
 recursiveSize x = do
   performGC
   liftM snd $ go ([], 0) $ asBox x
-  where go (vs, acc) b@(Box y)
-          | b `elem` vs = return (vs, acc)
-          | otherwise   = do
+  where go (vs, acc) b@(Box y) = do
+          isElem <- liftM or $ mapM (areBoxesEqual b) vs
+          if isElem
+            then return (vs, acc)
+            else do
              size    <- closureSize y
              closure <- getClosureData y
-             --putStrLn $ (show b) ++ " | " ++ (show closure)
              foldM go (b : vs, acc + size) $ allPtrs closure
