diff --git a/Modules/stdwinmodule.c b/Modules/stdwinmodule.c
index e1d3982..f81351d 100644
--- a/Modules/stdwinmodule.c
+++ b/Modules/stdwinmodule.c
@@ -166,77 +166,14 @@
 makepoint(a, b)
 	int a, b;
 {
-	object *v;
-	object *w;
-	if ((v = newtupleobject(2)) == NULL)
-		return NULL;
-	if ((w = newintobject((long)a)) == NULL ||
-		settupleitem(v, 0, w) != 0 ||
-		(w = newintobject((long)b)) == NULL ||
-		settupleitem(v, 1, w) != 0) {
-		DECREF(v);
-		return NULL;
-	}
-	return v;
+	return mkvalue("(ii)", a, b);
 }
 
 static object *
 makerect(a, b, c, d)
 	int a, b, c, d;
 {
-	object *v;
-	object *w;
-	if ((v = newtupleobject(2)) == NULL)
-		return NULL;
-	if ((w = makepoint(a, b)) == NULL ||
-		settupleitem(v, 0, w) != 0 ||
-		(w = makepoint(c, d)) == NULL ||
-		settupleitem(v, 1, w) != 0) {
-		DECREF(v);
-		return NULL;
-	}
-	return v;
-}
-
-static object *
-makemouse(hor, ver, clicks, button, mask)
-	int hor, ver, clicks, button, mask;
-{
-	object *v;
-	object *w;
-	if ((v = newtupleobject(4)) == NULL)
-		return NULL;
-	if ((w = makepoint(hor, ver)) == NULL ||
-		settupleitem(v, 0, w) != 0 ||
-		(w = newintobject((long)clicks)) == NULL ||
-		settupleitem(v, 1, w) != 0 ||
-		(w = newintobject((long)button)) == NULL ||
-		settupleitem(v, 2, w) != 0 ||
-		(w = newintobject((long)mask)) == NULL ||
-		settupleitem(v, 3, w) != 0) {
-		DECREF(v);
-		return NULL;
-	}
-	return v;
-}
-
-static object *
-makemenu(mp, item)
-	object *mp;
-	int item;
-{
-	object *v;
-	object *w;
-	if ((v = newtupleobject(2)) == NULL)
-		return NULL;
-	INCREF(mp);
-	if (settupleitem(v, 0, mp) != 0 ||
-		(w = newintobject((long)item)) == NULL ||
-		settupleitem(v, 1, w) != 0) {
-		DECREF(v);
-		return NULL;
-	}
-	return v;
+	return mkvalue("((ii)(ii))", a, b, c, d);
 }
 
 
@@ -1779,7 +1716,7 @@
 	object *args;
 {
 	EVENT e;
-	object *v, *w;
+	object *u, *v, *w;
 	if (!getnoarg(args))
 		return NULL;
 	if (Drawing != NULL) {
@@ -1804,15 +1741,7 @@
 		/* Turn WC_CLOSE commands into WE_CLOSE events */
 		e.type = WE_CLOSE;
 	}
-	v = newtupleobject(3);
-	if (v == NULL)
-		return NULL;
-	if ((w = newintobject((long)e.type)) == NULL) {
-		DECREF(v);
-		return NULL;
-	}
-	settupleitem(v, 0, w);
-	settupleitem(v, 1, window2object(e.window));
+	v = window2object(e.window);
 	switch (e.type) {
 	case WE_CHAR:
 		{
@@ -1831,7 +1760,8 @@
 	case WE_MOUSE_DOWN:
 	case WE_MOUSE_MOVE:
 	case WE_MOUSE_UP:
-		w = makemouse(e.u.where.h, e.u.where.v,
+		w = mkvalue("((ii)iii)",
+				e.u.where.h, e.u.where.v,
 				e.u.where.clicks,
 				e.u.where.button,
 				e.u.where.mask);
@@ -1839,7 +1769,8 @@
 	case WE_MENU:
 		if (e.u.m.id >= IDOFFSET && e.u.m.id < IDOFFSET+MAXNMENU &&
 				menulist[e.u.m.id - IDOFFSET] != NULL)
-			w = (object *)menulist[e.u.m.id - IDOFFSET];
+			w = mkvalue("(Oi)",
+				    menulist[e.u.m.id - IDOFFSET], e.u.m.item);
 		else {
 			/* Ghost menu event.
 			   Can occur only on the Mac if another part
@@ -1848,7 +1779,6 @@
 			DECREF(v);
 			goto again;
 		}
-		w = makemenu(w, e.u.m.item);
 		break;
 	case WE_LOST_SEL:
 		w = newintobject((long)e.u.sel);
@@ -1862,8 +1792,10 @@
 		DECREF(v);
 		return NULL;
 	}
-	settupleitem(v, 2, w);
-	return v;
+	u = mkvalue("(iOO)", e.type, v, w);
+	XDECREF(v);
+	XDECREF(w);
+	return u;
 }
 
 static object *
