diff --git a/includes/rts/storage/ClosureMacros.h b/includes/rts/storage/ClosureMacros.h
index 5722769651d7de24fbc49b000d8300b1182256b4..e10b86a006fe2bdbebb6bc9bb318428bb7a477ae 100644
--- a/includes/rts/storage/ClosureMacros.h
+++ b/includes/rts/storage/ClosureMacros.h
@@ -159,27 +159,35 @@ INLINE_HEADER StgHalfWord GET_TAG(const StgClosure *con)
 
 /* These are hard-coded. */
 #define THUNK_STATIC_LINK(p) (&(p)->payload[1])
-#define IND_STATIC_LINK(p)   (&(p)->payload[1])
+#define IND_STATIC_LINK(p) (&(p)->payload[1])
+#define SMALL_MUT_ARR_STATIC_LINK(p) (&((StgSmallMutArrPtrs*)p)->payload[((StgSmallMutArrPtrs*)p)->ptrs])
+#define CONSTR_AND_FUN_STATIC_LINK(info,p) (&(p)->payload[info->layout.payload.ptrs + info->layout.payload.nptrs])
 
 INLINE_HEADER StgClosure **
 STATIC_LINK(const StgInfoTable *info, StgClosure *p)
 {
     switch (info->type) {
+    case FUN_STATIC:
+    case CONSTR:
+    case CONSTR_1_0:
+    case CONSTR_2_0:
+    case CONSTR_1_1:
+        return CONSTR_AND_FUN_STATIC_LINK(info,p);
+
     case THUNK_STATIC:
         return THUNK_STATIC_LINK(p);
 
     case IND_STATIC:
         return IND_STATIC_LINK(p);
 
-    case SMALL_MUT_ARR_PTRS_CLEAN:
-    case SMALL_MUT_ARR_PTRS_FROZEN_CLEAN:
+    // case SMALL_MUT_ARR_PTRS_CLEAN: // TODO: do we really need this case?
+    // case SMALL_MUT_ARR_PTRS_FROZEN_CLEAN: // TODO: do we really need this case?
     case SMALL_MUT_ARR_PTRS_DIRTY:
     case SMALL_MUT_ARR_PTRS_FROZEN_DIRTY:
-        return (StgSmallMutArrPtrs*)p->payload[(StgSmallMutArrPtrs*)p->size];
+        return SMALL_MUT_ARR_STATIC_LINK(p);
 
     default:
-        return &p->payload[info->layout.payload.ptrs +
-                           info->layout.payload.nptrs];
+        barf("STATIC_LINK: strange closure type %d", (int)(info->type));
     }
 }
 
diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c
index 93941393ff9fdfed898180491ecc748f40846b11..26a6d3eac936893832c258e2f12ab34521f7c52b 100644
--- a/rts/sm/Evac.c
+++ b/rts/sm/Evac.c
@@ -604,7 +604,7 @@ loop:
 
       case FUN_STATIC:
           if (info->srt != 0 || info->layout.payload.ptrs != 0) {
-              evacuate_static_object(STATIC_LINK(info,(StgClosure *)q), q);
+              evacuate_static_object(CONSTR_AND_FUN_STATIC_LINK(info,(StgClosure *)q), q);
           }
           return;
 
@@ -620,7 +620,7 @@ loop:
       case CONSTR_1_0:
       case CONSTR_2_0:
       case CONSTR_1_1:
-          evacuate_static_object(STATIC_LINK(info,(StgClosure *)q), q);
+          evacuate_static_object(CONSTR_AND_FUN_STATIC_LINK(info,(StgClosure *)q), q);
           return;
 
       case CONSTR_0_1:
@@ -635,7 +635,7 @@ loop:
       case SMALL_MUT_ARR_PTRS_FROZEN_CLEAN: // todo: do we even need to evac this case?
       case SMALL_MUT_ARR_PTRS_DIRTY:
       case SMALL_MUT_ARR_PTRS_FROZEN_DIRTY:
-          evacuate_static_object(STATIC_LINK(info,(StgSmallMutArrPtrs*)q), q);
+          evacuate_static_object(SMALL_MUT_ARR_STATIC_LINK((StgSmallMutArrPtrs*)q), q);
           return;
 
       default: