diff --git a/cbits/HeapView.c b/cbits/HeapView.c
--- a/cbits/HeapView.c
+++ b/cbits/HeapView.c
@@ -247,6 +247,7 @@
         case MUT_VAR_CLEAN:
             ptrs[nptrs++] = ((StgMutVar *)closure)->var;
             break;
+        case MVAR_DIRTY:
         case MVAR_CLEAN:
             ptrs[nptrs++] = (StgClosure *)((StgMVar *)closure)->head;
             ptrs[nptrs++] = (StgClosure *)((StgMVar *)closure)->tail;
diff --git a/ghc-heap-view.cabal b/ghc-heap-view.cabal
--- a/ghc-heap-view.cabal
+++ b/ghc-heap-view.cabal
@@ -1,5 +1,5 @@
 Name:                ghc-heap-view
-Version:             0.5.3
+Version:             0.5.4
 Synopsis:            Extract the heap representation of Haskell values and thunks
 Description:
   This library provides functions to introspect the Haskell heap, for example
@@ -64,7 +64,7 @@
     GHC.Disassembler
     GHC.HeapView.Debug
   Build-depends:
-    base >= 4.5 && < 4.8,
+    base >= 4.5 && < 4.9,
     containers,
     transformers,
     template-haskell,
diff --git a/src/GHC/HeapView.hs b/src/GHC/HeapView.hs
--- a/src/GHC/HeapView.hs
+++ b/src/GHC/HeapView.hs
@@ -560,6 +560,8 @@
         AP -> do
             unless (length ptrs >= 1) $
                 fail "Expected at least 1 ptr argument to AP"
+            unless (length wds >= 3) $
+                fail "Expected at least 3 raw words to AP"
             return $ APClosure itbl 
                 (fromIntegral $ wds !! 2)
                 (fromIntegral $ shiftR (wds !! 2) (wORD_SIZE_IN_BITS `div` 2))
@@ -568,6 +570,8 @@
         PAP -> do
             unless (length ptrs >= 1) $
                 fail "Expected at least 1 ptr argument to PAP"
+            unless (length wds >= 3) $
+                fail "Expected at least 3 raw words to AP"
             return $ PAPClosure itbl 
                 (fromIntegral $ wds !! 2)
                 (fromIntegral $ shiftR (wds !! 2) (wORD_SIZE_IN_BITS `div` 2))
@@ -596,22 +600,32 @@
                 fail "Expected at least 1 ptr argument to BLACKHOLE"
             return $ BlackholeClosure itbl (head ptrs)
 
-        BCO ->
+        BCO -> do
+            unless (length ptrs >= 3) $
+                fail $ "Expected at least 3 ptr argument to BCO, found " ++ show (length ptrs)
+            unless (length wds >= 6) $
+                fail $ "Expected at least 6 words to BCO, found " ++ show (length wds)
             return $ BCOClosure itbl (ptrs !! 0) (ptrs !! 1) (ptrs !! 2)
                 (fromIntegral $ wds !! 4)
                 (fromIntegral $ shiftR (wds !! 4) (wORD_SIZE_IN_BITS `div` 2))
                 (wds !! 5)
 
-        ARR_WORDS ->
+        ARR_WORDS -> do
+            unless (length wds >= 2) $
+                fail $ "Expected at least 2 words to ARR_WORDS, found " ++ show (length wds)
             return $ ArrWordsClosure itbl (wds !! 1) (drop 2 wds)
 
-        t | t == MUT_ARR_PTRS_FROZEN || t == MUT_ARR_PTRS_FROZEN0 ->
+        t | t == MUT_ARR_PTRS_FROZEN || t == MUT_ARR_PTRS_FROZEN0 -> do
+            unless (length wds >= 3) $
+                fail $ "Expected at least 3 words to MUT_ARR_PTRS_FROZEN0 found " ++ show (length wds)
             return $ MutArrClosure itbl (wds !! 1) (wds !! 2) ptrs
 
         t | t == MUT_VAR_CLEAN || t == MUT_VAR_DIRTY ->
             return $ MutVarClosure itbl (head ptrs)
 
-        t | t == MVAR_CLEAN || t == MVAR_DIRTY ->
+        t | t == MVAR_CLEAN || t == MVAR_DIRTY -> do
+            unless (length ptrs >= 3) $
+                fail $ "Expected at least 3 ptrs to MVAR, found " ++ show (length ptrs)
             return $ MVarClosure itbl (ptrs !! 0) (ptrs !! 1) (ptrs !! 2)
 
         BLOCKING_QUEUE ->
