It turned out not so difficult to support old-style numbers (those
without the Py_TPFLAGS_CHECKTYPES flag) in the wrappers.  This
required a few changes in test_descr.py to cope with the fact that the
complex type has __int__, __long__ and __float__ methods that always
raise an exception.
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 34a20e1..65267d3 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -1979,6 +1979,22 @@
 }
 
 static PyObject *
+wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
+{
+	binaryfunc func = (binaryfunc)wrapped;
+	PyObject *other;
+
+	if (!PyArg_ParseTuple(args, "O", &other))
+		return NULL;
+	if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
+	    self->ob_type != other->ob_type) {
+		Py_INCREF(Py_NotImplemented);
+		return Py_NotImplemented;
+	}
+	return (*func)(self, other);
+}
+
+static PyObject *
 wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
 {
 	binaryfunc func = (binaryfunc)wrapped;
@@ -1986,6 +2002,11 @@
 
 	if (!PyArg_ParseTuple(args, "O", &other))
 		return NULL;
+	if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
+	    self->ob_type != other->ob_type) {
+		Py_INCREF(Py_NotImplemented);
+		return Py_NotImplemented;
+	}
 	return (*func)(other, self);
 }
 
@@ -1993,7 +2014,7 @@
 #define BINARY(NAME, OP) \
 static struct wrapperbase tab_##NAME[] = { \
 	{"__" #NAME "__", \
-	 (wrapperfunc)wrap_binaryfunc, \
+	 (wrapperfunc)wrap_binaryfunc_l, \
 	 "x.__" #NAME "__(y) <==> " #OP}, \
 	{"__r" #NAME "__", \
 	 (wrapperfunc)wrap_binaryfunc_r, \
@@ -2778,11 +2799,7 @@
 		ADD(mp->mp_ass_subscript, tab_setitem);
 	}
 
-	/* We don't support "old-style numbers" because their binary
-	   operators require that both arguments have the same type;
-	   the wrappers here only work for new-style numbers. */
-	if ((type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
-	    (nb = type->tp_as_number) != NULL) {
+	if ((nb = type->tp_as_number) != NULL) {
 		ADD(nb->nb_add, tab_add);
 		ADD(nb->nb_subtract, tab_sub);
 		ADD(nb->nb_multiply, tab_mul);
@@ -2817,7 +2834,7 @@
 		ADD(nb->nb_inplace_and, tab_iand);
 		ADD(nb->nb_inplace_xor, tab_ixor);
 		ADD(nb->nb_inplace_or, tab_ior);
-		if (type->tp_flags & Py_TPFLAGS_CHECKTYPES) {
+		if (type->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
 			ADD(nb->nb_floor_divide, tab_floordiv);
 			ADD(nb->nb_true_divide, tab_truediv);
 			ADD(nb->nb_inplace_floor_divide, tab_ifloordiv);