More stuff discovered while writing the simplest of testcases:

tupledealloc(): only feed the free list when the type is really a
tuple, not a subtype.  Otherwise, use PyObject_GC_Del().

_PyTuple_Resize(): disallow using this for tuple subtypes.
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index 9ae732f..6401dca 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -146,7 +146,10 @@
 		while (--i >= 0)
 			Py_XDECREF(op->ob_item[i]);
 #if MAXSAVESIZE > 0
-		if (len < MAXSAVESIZE && num_free_tuples[len] < MAXSAVEDTUPLES) {
+		if (len < MAXSAVESIZE &&
+		    num_free_tuples[len] < MAXSAVEDTUPLES &&
+		    op->ob_type == &PyTuple_Type)
+		{
 			op->ob_item[0] = (PyObject *) free_tuples[len];
 			num_free_tuples[len]++;
 			free_tuples[len] = op;
@@ -594,7 +597,7 @@
 	int sizediff;
 
 	v = (PyTupleObject *) *pv;
-	if (v == NULL || !PyTuple_Check(v) ||
+	if (v == NULL || v->ob_type != &PyTuple_Type ||
 	    (v->ob_size != 0 && v->ob_refcnt != 1)) {
 		*pv = 0;
 		Py_XDECREF(v);