diff --git a/src/array.c b/src/array.c
index 29e4bda2116718a07a22008f0e484c51a3e59bcd..eaae9a7e4f669453038c7b4b05d8da5e634b6477 100644
--- a/src/array.c
+++ b/src/array.c
@@ -1428,7 +1428,7 @@ PMOD_EXPORT TYPE_FIELD array_fix_type_field(struct array *v)
 
   for(e=0; e<v->size; e++) {
     check_svalue (ITEM(v) + e);
-    t |= 1 << TYPEOF(ITEM(v)[e]);
+    t |= BITOF(ITEM(v)[e]);
   }
 
 #ifdef PIKE_DEBUG
diff --git a/src/svalue.c b/src/svalue.c
index 0f32235318c69c66ae96ef6c9817a202b8060bd5..dc784ba1da239645dfc634595987aeff768839c0 100644
--- a/src/svalue.c
+++ b/src/svalue.c
@@ -2344,7 +2344,7 @@ PMOD_EXPORT TYPE_FIELD real_gc_mark_svalues(struct svalue *s, size_t num)
 		      GC_DO_MARK, MARK_PRE,
 		      DO_MARK_FUNC_SVALUE, GC_DO_MARK,
 		      DO_MARK_STRING, GC_DO_MARK);
-    t |= 1 << TYPEOF(*s);
+    t |= BITOF(*s);
   }
   return freed ? t : 0;
 }
@@ -2361,7 +2361,7 @@ TYPE_FIELD gc_mark_weak_svalues(struct svalue *s, size_t num)
 		      GC_DONT_MARK, MARK_PRE,
 		      DO_MARK_FUNC_SVALUE, DO_MARK_OBJ_WEAK,
 		      DO_MARK_STRING, GC_DO_MARK);
-    t |= 1 << TYPEOF(*s);
+    t |= BITOF(*s);
   }
   return freed ? t : 0;
 }
@@ -2440,7 +2440,7 @@ PMOD_EXPORT TYPE_FIELD real_gc_cycle_check_svalues(struct svalue *s, size_t num)
 		      DO_CYCLE_CHECK, {},
 		      DO_CYCLE_CHECK_FUNC_SVALUE, DO_CYCLE_CHECK,
 		      DONT_CYCLE_CHECK_STRING, DONT_CYCLE_CHECK);
-    t |= 1 << TYPEOF(*s);
+    t |= BITOF(*s);
   }
   return freed ? t : 0;
 }
@@ -2457,7 +2457,7 @@ TYPE_FIELD gc_cycle_check_weak_svalues(struct svalue *s, size_t num)
 		      DO_CYCLE_CHECK_WEAK, {},
 		      DO_CYCLE_CHECK_FUNC_SVALUE, DO_CYCLE_CHECK_WEAK,
 		      DONT_CYCLE_CHECK_STRING, DONT_CYCLE_CHECK);
-    t |= 1 << TYPEOF(*s);
+    t |= BITOF(*s);
   }
   return freed ? t : 0;
 }
diff --git a/src/svalue.h b/src/svalue.h
index 247d8f03783606434f9c74b8644f7a4974a55c2e..6a183a4c315fdffea6654692e55dd92f9af810a8 100644
--- a/src/svalue.h
+++ b/src/svalue.h
@@ -847,6 +847,14 @@ int svalues_are_constant(const struct svalue *s,
 			 TYPE_FIELD hint,
 			 struct processing *p);
 
+static INLINE TYPE_FIELD BITOF(struct svalue sv) {
+    if (TYPEOF(sv) >= sizeof(TYPE_FIELD) * 8) {
+        return BIT_MIXED | BIT_UNFINISHED;
+    }
+
+    return 1 << TYPEOF(sv);
+}
+
 #define gc_cycle_check_without_recurse gc_mark_without_recurse
 #define gc_cycle_check_weak_without_recurse gc_mark_without_recurse