diff --git a/rts/TraverseHeap.c b/rts/TraverseHeap.c
index 1757218ab788c8a945fa001e87a0ea7b20cb2d84..e3d3c8390cae881987ef120facadb750242fa229 100644
--- a/rts/TraverseHeap.c
+++ b/rts/TraverseHeap.c
@@ -1239,12 +1239,15 @@ inner_loop:
         traversePushClosure(ts, (StgClosure *) tso->blocked_exceptions, c, sep, child_data);
         traversePushClosure(ts, (StgClosure *) tso->bq, c, sep, child_data);
         traversePushClosure(ts, (StgClosure *) tso->trec, c, sep, child_data);
-        if (   tso->why_blocked == BlockedOnMVar
-               || tso->why_blocked == BlockedOnMVarRead
-               || tso->why_blocked == BlockedOnBlackHole
-               || tso->why_blocked == BlockedOnMsgThrowTo
-            ) {
+        switch (tso->why_blocked) {
+        case BlockedOnMVar:
+        case BlockedOnMVarRead:
+        case BlockedOnBlackHole:
+        case BlockedOnMsgThrowTo:
             traversePushClosure(ts, tso->block_info.closure, c, sep, child_data);
+            break;
+        default:
+            break;
         }
         goto loop;
     }
diff --git a/rts/sm/Compact.c b/rts/sm/Compact.c
index f6e65ecc9a25e9462b709a7bd9edd488e2be3281..92ac86779ac9aec54eea9cdb857f4d55c0231485 100644
--- a/rts/sm/Compact.c
+++ b/rts/sm/Compact.c
@@ -463,13 +463,16 @@ thread_TSO (StgTSO *tso)
     thread_(&tso->_link);
     thread_(&tso->global_link);
 
-    if (   tso->why_blocked == BlockedOnMVar
-        || tso->why_blocked == BlockedOnMVarRead
-        || tso->why_blocked == BlockedOnBlackHole
-        || tso->why_blocked == BlockedOnMsgThrowTo
-        || tso->why_blocked == NotBlocked
-        ) {
+    switch (tso->why_blocked) {
+    case BlockedOnMVar:
+    case BlockedOnMVarRead:
+    case BlockedOnBlackHole:
+    case BlockedOnMsgThrowTo:
+    case NotBlocked:
         thread_(&tso->block_info.closure);
+        break;
+    default:
+        break;
     }
     thread_(&tso->blocked_exceptions);
     thread_(&tso->bq);
diff --git a/rts/sm/NonMovingMark.c b/rts/sm/NonMovingMark.c
index ab485f2d0c9b73af289ff9a67a356b3f20f8f1cd..cfa506303695c8ea94da1e83114b168051338b00 100644
--- a/rts/sm/NonMovingMark.c
+++ b/rts/sm/NonMovingMark.c
@@ -1052,13 +1052,16 @@ trace_tso (MarkQueue *queue, StgTSO *tso)
     if (tso->label != NULL) {
         markQueuePushClosure_(queue, (StgClosure *) tso->label);
     }
-    if (   tso->why_blocked == BlockedOnMVar
-        || tso->why_blocked == BlockedOnMVarRead
-        || tso->why_blocked == BlockedOnBlackHole
-        || tso->why_blocked == BlockedOnMsgThrowTo
-        || tso->why_blocked == NotBlocked
-        ) {
+    switch (tso->why_blocked) {
+    case BlockedOnMVar:
+    case BlockedOnMVarRead:
+    case BlockedOnBlackHole:
+    case BlockedOnMsgThrowTo:
+    case NotBlocked:
         markQueuePushClosure_(queue, tso->block_info.closure);
+        break;
+    default:
+        break;
     }
 }
 
diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c
index 8debec6a6662683591e70894981d9f8164420d73..29012f8ed3dd1f572c1ce87015ab48d7958e2434 100644
--- a/rts/sm/Scav.c
+++ b/rts/sm/Scav.c
@@ -137,23 +137,24 @@ scavengeTSO (StgTSO *tso)
         evacuate((StgClosure **)&tso->label);
     }
 
-    if (   tso->why_blocked == BlockedOnMVar
-        || tso->why_blocked == BlockedOnMVarRead
-        || tso->why_blocked == BlockedOnBlackHole
-        || tso->why_blocked == BlockedOnMsgThrowTo
-        || tso->why_blocked == NotBlocked
-        ) {
+    switch (tso->why_blocked) {
+    case BlockedOnMVar:
+    case BlockedOnMVarRead:
+    case BlockedOnBlackHole:
+    case BlockedOnMsgThrowTo:
+    case NotBlocked:
         evacuate(&tso->block_info.closure);
-    }
+        break;
+    default:
 #if defined(THREADED_RTS)
     // in the THREADED_RTS, block_info.closure must always point to a
     // valid closure, because we assume this in throwTo().  In the
     // non-threaded RTS it might be a FD (for
     // BlockedOnRead/BlockedOnWrite) or a time value (BlockedOnDelay)
-    else {
         tso->block_info.closure = (StgClosure *)END_TSO_QUEUE;
-    }
 #endif
+        break;
+    }
 
     tso->dirty = gct->failed_to_evac;