diff --git a/src/builtin.cmod b/src/builtin.cmod
index bd6b0fa0e32beec16d34461d95b1b22cd6700db8..6f47de33de00e13151f6f8f8f66a3d79a47da00d 100644
--- a/src/builtin.cmod
+++ b/src/builtin.cmod
@@ -3457,7 +3457,7 @@ PIKECLASS multi_string_replace
       if( THIS->ctx.v )
       {
           struct svalue tmp;
-          tmp.type = PIKE_T_STRING;
+          SET_SVAL_TYPE(tmp, PIKE_T_STRING);
           for( i=0; i<THIS->ctx.num; i++ )
           {
               res += sizeof(struct replace_many_tupel);
diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index 47e14d40b18187ec9e74cb6393c7e322f5dcdd55..0b7b07c68ef120fa03d7aaf182acde6822ba00e5 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -7610,7 +7610,7 @@ unsigned int rec_size_svalue( struct svalue *s, struct mapping **m )
     struct svalue *x;
     struct keypair *k;
 
-    switch( s->type )
+    switch( TYPEOF(*s) )
     {
         case PIKE_T_STRING:
             /* FIXME: This makes assumptions about the threshold for short strings. */
@@ -7636,7 +7636,7 @@ unsigned int rec_size_svalue( struct svalue *s, struct mapping **m )
     }
 
     low_mapping_insert( *m, s, &svalue_int_one, 0 );
-    switch( s->type )
+    switch( TYPEOF(*s) )
     {
         case PIKE_T_ARRAY:
             res = sizeof( struct array );
@@ -7713,7 +7713,7 @@ static void f__size_object( INT32 UNUSED(args) )
     struct object *o;
     struct program *p;
     struct mapping *map = NULL;
-    if( Pike_sp[-1].type != PIKE_T_OBJECT )
+    if( TYPEOF(Pike_sp[-1]) != PIKE_T_OBJECT )
         Pike_error("Expected an object as argument\n");
     o = Pike_sp[-1].u.object;
 
@@ -7729,7 +7729,7 @@ static void f__size_object( INT32 UNUSED(args) )
     if( (fun = low_find_lfun( p, LFUN__SIZE_OBJECT)) != -1 )
     {
         apply_low( o, fun, 0 );
-        if( Pike_sp[-1].type == PIKE_T_INT )
+        if( TYPEOF(Pike_sp[-1]) == PIKE_T_INT )
             sum += Pike_sp[-1].u.integer;
         pop_stack();
     }
@@ -9457,7 +9457,7 @@ PMOD_EXPORT void f_program_identifier_defined(INT32 args)
   if( !(p = program_from_svalue(Pike_sp-args)) )
       Pike_error("Illegal argument 1 to defined(program,string)\n");
 
-  if( Pike_sp[-args+1].type != PIKE_T_STRING )
+  if( TYPEOF(Pike_sp[1-args]) != PIKE_T_STRING )
       Pike_error("Illegal argument 2 to defined(program,string)\n");
   else
       ident = Pike_sp[-args+1].u.string;
diff --git a/src/interpret_functions.h b/src/interpret_functions.h
index 0db899384e8637567950e3b783d150bcd64d860b..d8cd89e95d6e36b6027b99cecf2a26a274494dab 100644
--- a/src/interpret_functions.h
+++ b/src/interpret_functions.h
@@ -505,13 +505,14 @@ OPCODE2(F_ADD_LOCALS_AND_POP, "local += local", 0,
 {
   struct svalue *dst = Pike_fp->locals+arg1;
   struct svalue *src = Pike_fp->locals+arg2;
-  if( (dst->type|src->type) == PIKE_T_INT
+  /* NB: The following test only works because PIKE_T_INT == 0! */
+  if( (TYPEOF(*dst)|TYPEOF(*src)) == PIKE_T_INT
       && !INT_TYPE_ADD_OVERFLOW(src->u.integer,dst->u.integer) )
   {
     SET_SVAL_SUBTYPE(*dst,NUMBER_NUMBER);
     dst->u.integer += src->u.integer;
   }
-  else if( dst->type == src->type && dst->type == PIKE_T_STRING )
+  else if(TYPEOF(*dst) == TYPEOF(*src) && TYPEOF(*dst) == PIKE_T_STRING )
   {
       struct pike_string *srcs = src->u.string;
       struct pike_string *dsts = dst->u.string;
@@ -548,7 +549,7 @@ OPCODE2(F_ADD_LOCALS_AND_POP, "local += local", 0,
 
 OPCODE2(F_ADD_LOCAL_INT_AND_POP, "local += number", 0,{
   struct svalue *dst = Pike_fp->locals+arg1;
-  if( dst->type == PIKE_T_INT
+  if( TYPEOF(*dst) == PIKE_T_INT
       && !INT_TYPE_ADD_OVERFLOW(dst->u.integer,arg2) )
   {
     SET_SVAL_SUBTYPE(*dst,NUMBER_NUMBER);
@@ -566,7 +567,7 @@ OPCODE2(F_ADD_LOCAL_INT_AND_POP, "local += number", 0,{
 
 OPCODE2(F_ADD_LOCAL_INT, "local += number local", 0,{
   struct svalue *dst = Pike_fp->locals+arg1;
-  if( dst->type == PIKE_T_INT
+  if( TYPEOF(*dst) == PIKE_T_INT
       && !INT_TYPE_ADD_OVERFLOW(dst->u.integer,arg2) )
   {
     SET_SVAL_SUBTYPE(*dst,NUMBER_NUMBER);
diff --git a/src/post_modules/CritBit/critbit/value_svalue.h b/src/post_modules/CritBit/critbit/value_svalue.h
index 4cb573db3e7a0096de53a92b633ead1a4e5c0bb5..a230b770fe3d48398d91b1c9e52965f5db7f16aa 100644
--- a/src/post_modules/CritBit/critbit/value_svalue.h
+++ b/src/post_modules/CritBit/critbit/value_svalue.h
@@ -12,8 +12,8 @@ typedef struct svalue CB_NAME(value);
 #define CB_SET_VALUE(node, v)	assign_svalue(&((node)->value), (v))
 #define CB_GET_VALUE(node, v)	assign_svalue_no_free((v), &((node)->value))
 #define CB_FREE_VALUE(v)	free_svalue(v)
-#define CB_HAS_VALUE(node)	((node)->value.type != T_VOID)
-#define CB_INIT_VALUE(node)	do { (node)->value.type = T_VOID; } while(0)
+#define CB_HAS_VALUE(node)	(TYPEOF((node)->value) != T_VOID)
+#define CB_INIT_VALUE(node)	do { SET_SVAL_TYPE((node)->value, T_VOID); } while(0)
 #define CB_RM_VALUE(node)	do { if (CB_HAS_VALUE(node)) \
     free_svalue(&((node)->value)); CB_INIT_VALUE(node); } while(0)
 #define CB_PUSH_VALUE(v)	push_svalue(&(v))
diff --git a/src/post_modules/CritBit/iterator_source.H b/src/post_modules/CritBit/iterator_source.H
index 2d5b548cddad9daf35ba481bb89fe5113f3254f4..399b9de29df7e8a6bf0e8804e388aee50d22ccdb 100644
--- a/src/post_modules/CritBit/iterator_source.H
+++ b/src/post_modules/CritBit/iterator_source.H
@@ -32,7 +32,7 @@
 	}
 
 	INIT {
-	    THIS->lastval.type = T_VOID;
+	    SET_SVAL_TYPE(THIS->lastval, T_VOID);
 	    THIS->lastnode = NULL;
 	    THIS->step = 1;
 	    THIS->stop.len.chars = 0;
@@ -164,7 +164,7 @@
 			    apply_low(tree, encode_fun, 1);
 			    assign_svalue(stop, Pike_sp-1);
 			    pop_stack();
-			    if (!((1<<stop->type) & T_KEY))
+			    if (!((1<<TYPEOF(*stop)) & T_KEY))
 				SIMPLE_BAD_ARG_ERROR("create", 3, cmod_STRFY_EVAL(key_ptype));
 			}
 			THIS->stop = CB_LOW_KEY_FROM_SVALUE(stop);
@@ -179,7 +179,7 @@
 			    apply_low(tree, encode_fun, 1);
 			    assign_svalue(start, Pike_sp-1);
 			    pop_stack();
-			    if (!((1<<start->type) & T_KEY))
+			    if (!((1<<TYPEOF(*start)) & T_KEY))
 				SIMPLE_BAD_ARG_ERROR("create", 2, cmod_STRFY_EVAL(key_ptype));
 			}
 			s = CB_LOW_KEY_FROM_SVALUE(start);
diff --git a/src/post_modules/CritBit/tree_header.H b/src/post_modules/CritBit/tree_header.H
index eda717d335f35963854f67951bec5405524e9382..33e3cd31cc556dff65e2d8adde669d4562e136ed 100644
--- a/src/post_modules/CritBit/tree_header.H
+++ b/src/post_modules/CritBit/tree_header.H
@@ -73,7 +73,7 @@ DOCEND()
 #undef CB_CHECK_KEY
 #define CB_CHECK_KEY(svalue, fun, num)	do {			\
     CB_TRANSFORM_KEY(svalue);					\
-    if (!((1<<(svalue)->type) & T_KEY))   			\
+    if (!((1<<TYPEOF(*svalue)) & T_KEY))   			\
 	SIMPLE_BAD_ARG_ERROR(fun, (num), STRFY(key_ptype));	\
 } while(0)
 #undef CB_PUSH_TRANSFORM_KEY
@@ -91,12 +91,12 @@ TREE_CLASSIFY(_transform_svalue_to_key)(const struct svalue * s) {
     if (THIS->encode_fun >= 0) {
 	push_svalue(s);
 	apply_low(Pike_fp->current_object, THIS->encode_fun, 1);
-	if (!((1<<Pike_sp[-1].type) & T_KEY))
+	if (!((1<<TYPEOF(Pike_sp[-1])) & T_KEY))
 	    Pike_error("encode_key() is expected to return type " cmod_STRFY_EVAL(key_ptype) ".\n");
 	key = CB_LOW_KEY_FROM_SVALUE(Pike_sp-1);
 	pop_stack();
     } else {
-	if (!((1<<s->type) & T_KEY)) Pike_error("Expected type " cmod_STRFY_EVAL(key_ptype) ".\n");
+      if (!((1<<TYPEOF(*s)) & T_KEY)) Pike_error("Expected type " cmod_STRFY_EVAL(key_ptype) ".\n");
 	key = CB_LOW_KEY_FROM_SVALUE(s);
     }
     return key;
diff --git a/src/post_modules/CritBit/tree_high.c b/src/post_modules/CritBit/tree_high.c
index 9c21e1b0c221c8b070ac5037e3c8f2c019403d9f..0d2464f58db145c55588687b03ba8bd1e8002b79 100644
--- a/src/post_modules/CritBit/tree_high.c
+++ b/src/post_modules/CritBit/tree_high.c
@@ -72,7 +72,7 @@ static inline void cb_print_node(struct string_builder * buf,
 				 cb_node_t node, int depth) {
     string_builder_putchars(buf, ' ', depth);
     string_builder_sprintf(buf, "%x #%lu (%d) --> ", node,
-			   node->size, node->value.type);
+			   node->size, TYPEOF(node->value));
     string_builder_putchars(buf, ' ', MAXIMUM(0, 15-depth));
     cb_debug_print_key(buf, node->key);
     if (CB_HAS_VALUE(node)) CB_PRINT_KEY(buf, node->key);
diff --git a/src/post_modules/CritBit/tree_source.H b/src/post_modules/CritBit/tree_source.H
index b17faadc329515e900e38ab73f12210e7f9f7b3f..ea8ef1e5bd50dacc02f297f6e29271d924927dde 100644
--- a/src/post_modules/CritBit/tree_source.H
+++ b/src/post_modules/CritBit/tree_source.H
@@ -101,7 +101,7 @@ cmod_DEFINE_EVAL(COPY_NODE, TREE_CLASSIFY(_copy_node))
     {
 
 	if (args == 1) {
-	    switch (o->type) {
+	  switch (TYPEOF(*o)) {
 	    case PIKE_T_MAPPING: {
 		struct keypair *k;
 		INT32 e;
@@ -124,9 +124,9 @@ cmod_DEFINE_EVAL(COPY_NODE, TREE_CLASSIFY(_copy_node))
 		}
 		return;
 	    }
-	    }
+	  }
 ARG_ERROR:
-	    SIMPLE_BAD_ARG_ERROR("create", 1, "mapping(" cmod_STRFY_EVAL(key_ptype) ":mixed)|array");
+	  SIMPLE_BAD_ARG_ERROR("create", 1, "mapping(" cmod_STRFY_EVAL(key_ptype) ":mixed)|array");
 	}
     }
 
@@ -151,7 +151,7 @@ DOCEND()
 	    push_array(a);
 	    if (CB_HAS_VALUE(node)) {
 		s = ITEM(a)+start;
-		s->type = T_VOID;
+		SET_SVAL_TYPE(*s, T_VOID);
 		k = node->key;
 		CB_ASSIGN_SVALUE_KEY(k, s);
 		start ++;
@@ -162,7 +162,7 @@ DOCEND()
 			Pike_error("super bad!! tree has hidden entries.\n");
 		    }
 		    s = ITEM(a)+start;
-		    s->type = T_VOID;
+		    SET_SVAL_TYPE(*s, T_VOID);
 		    CB_ASSIGN_SVALUE_KEY(_->key, s);
 		    start ++;
 		}
@@ -286,7 +286,7 @@ DOCEND()
      */
     PIKEFUN mixed `[](mixed key) {
 	CB_TRANSFORM_KEY(key);
-	if ((1<<key->type) & T_KEY) {
+	if ((1 << TYPEOF(*key)) & T_KEY) {
 	    cb_node_t n;
 	    cb_key k = CB_LOW_KEY_FROM_SVALUE(key);
 	    pop_stack();
@@ -303,7 +303,7 @@ DOCEND()
     /*! @decl int(0..1) _equal(mixed o)
      */
     PIKEFUN int _equal(mixed o) {
-	if (o->type == PIKE_T_OBJECT
+	if (TYPEOF(*o) == PIKE_T_OBJECT
 	    && o->u.object->prog == Pike_fp->current_object->prog) {
 	    cb_node_t tree1, tree2;
 	    tree1 = THIS->tree.root;
@@ -339,7 +339,7 @@ DOCEND()
 	struct object * res;
 	cb_node_t node, tree = NULL;
 
-	if (o->type != PIKE_T_OBJECT || -1
+	if (TYPEOF(*o) != PIKE_T_OBJECT || -1
 	    == low_get_storage(o->u.object->prog, TREE_CLASSIFY(_program))) {
 	    SIMPLE_BAD_ARG_ERROR("`-", 1, "CritBit." cmod_STRFY_EVAL(tree_class));
 	}
@@ -372,7 +372,7 @@ DOCEND()
     PIKEFUN mixed `+(mixed o) {
 	cb_node_t tree1, tree2;
 
-	if (o->type != PIKE_T_OBJECT || -1
+	if (TYPEOF(*o) != PIKE_T_OBJECT || -1
 	    == low_get_storage(o->u.object->prog, TREE_CLASSIFY(_program))) {
 	    SIMPLE_BAD_ARG_ERROR("`+", 1, "inherits(CritBit." cmod_STRFY_EVAL(tree_class) ")");
 	}
diff --git a/src/post_modules/_PGsql/PGsql.cmod b/src/post_modules/_PGsql/PGsql.cmod
index 679e1e54bcd0ef853ceee7fb9fa912b6639aaf35..f568f32eca1d9b0cac9e22d9d9217c607f9f2314 100644
--- a/src/post_modules/_PGsql/PGsql.cmod
+++ b/src/post_modules/_PGsql/PGsql.cmod
@@ -96,7 +96,7 @@ PIKECLASS PGsql
     if(not_all)
       push_int(1);
     apply(THISOBJ,"read",1+!!not_all);
-    if(Pike_sp[-1].type == PIKE_T_STRING)
+    if(TYPEOF(Pike_sp[-1]) == PIKE_T_STRING)
     { i=Pike_sp[-1].u.string->len;
       memcpy(a,Pike_sp[-1].u.string->str,i);
     }
@@ -226,7 +226,7 @@ bad:
   {
 #ifdef TCP_NODELAY
     apply(THISOBJ,"query_fd",0);
-    if(Pike_sp[-1].type == PIKE_T_INT)
+    if(TYPEOF(Pike_sp[-1]) == PIKE_T_INT)
     { int fd=Pike_sp[-1].u.integer;
       int newval = 1;
       setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &newval, sizeof(newval));
@@ -336,7 +336,7 @@ outofmem: Pike_fatal("Out of memory\n");
 
     ref_push_object(portal); ref_push_string(MK_STRING("_buffer"));
     f_arrow(2);
-    if(Pike_sp[-1].type == PIKE_T_INT)
+    if(TYPEOF(Pike_sp[-1]) == PIKE_T_INT)
       buffer=Pike_sp[-1].u.integer;
     pop_stack();
 
@@ -357,7 +357,7 @@ outofmem: Pike_fatal("Out of memory\n");
 
     ref_push_object(portal); ref_push_string(MK_STRING("_rowsreceived"));
     f_arrow(2);
-    if(Pike_sp[-1].type != PIKE_T_INT)
+    if(TYPEOF(Pike_sp[-1]) != PIKE_T_INT)
       Pike_error("Driver needs to be fixed to support more than 2^31 rows\n");
     rowsreceived=Pike_sp[-1].u.integer;
     pop_stack();