64-bit
diff --git a/src/cmd/mk/arc.c b/src/cmd/mk/arc.c
index 521ef7a..5e0267f 100644
--- a/src/cmd/mk/arc.c
+++ b/src/cmd/mk/arc.c
@@ -41,7 +41,7 @@
 
 	sym = symlook("NREP", S_VAR, 0);
 	if(sym){
-		w = (Word *) sym->value;
+		w = sym->u.ptr;
 		if (w && w->s && *w->s)
 			nreps = atoi(w->s);
 	}
diff --git a/src/cmd/mk/archive.c b/src/cmd/mk/archive.c
index 9955b3f..0128890 100644
--- a/src/cmd/mk/archive.c
+++ b/src/cmd/mk/archive.c
@@ -55,15 +55,15 @@
 	t = mtime(archive);
 	sym = symlook(archive, S_AGG, 0);
 	if(sym){
-		if(force || (t > (long)sym->value)){
+		if(force || (t > sym->u.value)){
 			atimes(archive);
-			sym->value = (void *)t;
+			sym->u.value = t;
 		}
 	}
 	else{
 		atimes(archive);
 		/* mark the aggegate as having been done */
-		symlook(strdup(archive), S_AGG, "")->value = (void *)t;
+		symlook(strdup(archive), S_AGG, "")->u.value = t;
 	}
 		/* truncate long member name to sizeof of name field in archive header */
 	if(dolong)
@@ -72,7 +72,7 @@
 		snprint(buf, sizeof(buf), "%s(%.*s)", archive, SARNAME, member);
 	sym = symlook(buf, S_TIME, 0);
 	if (sym)
-		return (long)sym->value;	/* uggh */
+		return sym->u.value;
 	return 0;
 }
 
@@ -196,7 +196,7 @@
 		}
 		snprint(buf, sizeof buf, "%s(%s)", ar, name);
 		sym = symlook(strdup(buf), S_TIME, (void *)t);
-		sym->value = (void *)t;
+		sym->u.value = t;
 	skip:
 		t = atol(h.size);
 		if(t&01) t++;
diff --git a/src/cmd/mk/env.c b/src/cmd/mk/env.c
index ffb2762..11df34e 100644
--- a/src/cmd/mk/env.c
+++ b/src/cmd/mk/env.c
@@ -79,7 +79,7 @@
 	for(p = myenv; *p; p++)
 		if(strcmp(*p, s->name) == 0)
 			return;
-	envinsert(s->name, (Word *) s->value);
+	envinsert(s->name, s->u.ptr);
 }
 
 void
diff --git a/src/cmd/mk/file.c b/src/cmd/mk/file.c
index 2533343..d9409ba 100644
--- a/src/cmd/mk/file.c
+++ b/src/cmd/mk/file.c
@@ -23,7 +23,7 @@
 
 	sym = symlook(name, S_TIME, 0);
 	if (sym)
-		return (long) sym->value;		/* uggh */
+		return sym->u.value;
 
 	t = mtime(name);
 	if(t == 0)
@@ -77,7 +77,7 @@
 		} while(*s);
 		c = *s;
 		*s = 0;
-		symlook(strdup(cp), S_TIME, (void *)t)->value = (void *)t;
+		symlook(strdup(cp), S_TIME, (void *)t)->u.value = t;
 		if (c)
 			*s++ = c;
 		while(*s){
diff --git a/src/cmd/mk/graph.c b/src/cmd/mk/graph.c
index da346c0..4c46f7b 100644
--- a/src/cmd/mk/graph.c
+++ b/src/cmd/mk/graph.c
@@ -40,14 +40,14 @@
 /*	print("applyrules(%lux='%s')\n", target, target); */
 	sym = symlook(target, S_NODE, 0);
 	if(sym)
-		return (Node *)(sym->value);
+		return sym->u.ptr;
 	target = strdup(target);
 	node = newnode(target);
 	head.n = 0;
 	head.next = 0;
 	sym = symlook(target, S_TARGET, 0);
 	memset((char*)rmatch, 0, sizeof(rmatch));
-	for(r = sym? (Rule *)(sym->value):0; r; r = r->chain){
+	for(r = sym? sym->u.ptr:0; r; r = r->chain){
 		if(r->attr&META) continue;
 		if(strcmp(target, r->target)) continue;
 		if((!r->recipe || !*r->recipe) && (!r->tail || !r->tail->s || !*r->tail->s)) continue;	/* no effect; ignore */
diff --git a/src/cmd/mk/mk.c b/src/cmd/mk/mk.c
index 5ae4fc2..654d063 100644
--- a/src/cmd/mk/mk.c
+++ b/src/cmd/mk/mk.c
@@ -221,11 +221,11 @@
 				str = strdup(buf);
 			ret = pcmp(arc->prog, node->name, arc->n->name, arc->r->shellt, arc->r->shellcmd);
 			if(sym)
-				sym->value = (void *)ret;
+				sym->u.value = ret;
 			else
 				symlook(str, S_OUTOFDATE, (void *)ret);
 		} else
-			ret = (int)sym->value;
+			ret = sym->u.value;
 		return(ret-1);
 	} else if(strchr(arc->n->name, '(') && arc->n->time == 0)  /* missing archive member */
 		return 1;
diff --git a/src/cmd/mk/mk.h b/src/cmd/mk/mk.h
index 81f9d70..a40e9de 100644
--- a/src/cmd/mk/mk.h
+++ b/src/cmd/mk/mk.h
@@ -129,7 +129,10 @@
 {
 	short		space;
 	char		*name;
-	void		*value;
+	union {
+		void	*ptr;
+		uintptr	value;
+	} u;
 	struct Symtab	*next;
 } Symtab;
 
diff --git a/src/cmd/mk/recipe.c b/src/cmd/mk/recipe.c
index bf7f8ab..7993e09 100644
--- a/src/cmd/mk/recipe.c
+++ b/src/cmd/mk/recipe.c
@@ -59,7 +59,7 @@
 			aw = aw->next;
 			if((s = symlook(buf, S_NODE, 0)) == 0)
 				continue;	/* not a node we are interested in */
-			n = (Node *)s->value;
+			n = s->u.ptr;
 			if(aflag == 0 && n->time) {
 				for(a = n->prereqs; a; a = a->next)
 					if(a->n && outofdate(n, a, 0))
diff --git a/src/cmd/mk/rule.c b/src/cmd/mk/rule.c
index d73595d..439d611 100644
--- a/src/cmd/mk/rule.c
+++ b/src/cmd/mk/rule.c
@@ -15,7 +15,7 @@
 	r = 0;
 	reuse = 0;
 	if(sym = symlook(head, S_TARGET, 0)){
-		for(r = (Rule *)sym->value; r; r = r->chain)
+		for(r = sym->u.ptr; r; r = r->chain)
 			if(rcmp(r, head, tail) == 0){
 				reuse = 1;
 				break;
@@ -35,7 +35,7 @@
 	r->prog = prog;
 	r->rule = nrules++;
 	if(!reuse){
-		rr = (Rule *)symlook(head, S_TARGET, (void *)r)->value;
+		rr = symlook(head, S_TARGET, (void *)r)->u.ptr;
 		if(rr != r){
 			r->chain = rr->chain;
 			rr->chain = r;
diff --git a/src/cmd/mk/run.c b/src/cmd/mk/run.c
index 439cc0a..dd225c0 100644
--- a/src/cmd/mk/run.c
+++ b/src/cmd/mk/run.c
@@ -168,7 +168,7 @@
 	for(w = j->t; w; w = w->next){
 		if((s = symlook(w->s, S_NODE, 0)) == 0)
 			continue;	/* not interested in this node */
-		update(uarg, (Node *)s->value);
+		update(uarg, s->u.ptr);
 	}
 	if(nrunning < nproclimit)
 		sched();
@@ -182,7 +182,7 @@
 	Word *w;
 
 	if(sym = symlook("NPROC", S_VAR, 0)) {
-		w = (Word *) sym->value;
+		w = sym->u.ptr;
 		if (w && w->s && w->s[0])
 			nproclimit = atoi(w->s);
 	}
diff --git a/src/cmd/mk/symtab.c b/src/cmd/mk/symtab.c
index 06a4d14..17674c4 100644
--- a/src/cmd/mk/symtab.c
+++ b/src/cmd/mk/symtab.c
@@ -38,7 +38,7 @@
 	s = (Symtab *)Malloc(sizeof(Symtab));
 	s->space = space;
 	s->name = sym;
-	s->value = install;
+	s->u.ptr = install;
 	s->next = hash[h];
 	hash[h] = s;
 	return(s);
diff --git a/src/cmd/mk/unix.c b/src/cmd/mk/unix.c
index 7ecce69..c63d3ce 100644
--- a/src/cmd/mk/unix.c
+++ b/src/cmd/mk/unix.c
@@ -41,7 +41,7 @@
 			continue;
 		s = strdup(*p);
 		setvar(s, (void *)w);
-		symlook(s, S_EXPORTED, (void*)"")->value = (void*)"";
+		symlook(s, S_EXPORTED, (void*)"")->u.ptr = "";
 	}
 }
 
diff --git a/src/cmd/mk/var.c b/src/cmd/mk/var.c
index 8429918..3efe382 100644
--- a/src/cmd/mk/var.c
+++ b/src/cmd/mk/var.c
@@ -1,9 +1,9 @@
 #include	"mk.h"
 
 void
-setvar(char *name, void *value)
+setvar(char *name, void *ptr)
 {
-	symlook(name, S_VAR, value)->value = value;
+	symlook(name, S_VAR, ptr)->u.ptr = ptr;
 	symlook(name, S_MAKEVAR, (void*)"");
 }
 
@@ -13,7 +13,7 @@
 	Word *w;
 
 	Bprint(&bout, "\t%s=", s->name);
-	for (w = (Word *) s->value; w; w = w->next)
+	for (w = s->u.ptr; w; w = w->next)
 		Bprint(&bout, "'%s'", w->s);
 	Bprint(&bout, "\n");
 }
diff --git a/src/cmd/mk/varsub.c b/src/cmd/mk/varsub.c
index 5b7c984..223ba78 100644
--- a/src/cmd/mk/varsub.c
+++ b/src/cmd/mk/varsub.c
@@ -66,7 +66,7 @@
 	sym = symlook(name, S_VAR, 0);
 	if(sym){
 			/* check for at least one non-NULL value */
-		for (w = (Word*)sym->value; w; w = w->next)
+		for (w = sym->u.ptr; w; w = w->next)
 			if(w->s && *w->s)
 				return wdup(w);
 	}
@@ -113,10 +113,10 @@
 	*s = end+1;
 	
 	sym = symlook(buf->start, S_VAR, 0);
-	if(sym == 0 || sym->value == 0)
+	if(sym == 0 || sym->u.ptr == 0)
 		w = newword(buf->start);
 	else
-		w = subsub((Word*) sym->value, cp, end);
+		w = subsub(sym->u.ptr, cp, end);
 	freebuf(buf);
 	return w;
 }