Alas, Vladimir's patch caused a bus error (probably double
alignment?), and I didn't test it.  Withdrawing it for now.
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index f8da205..070e83d 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -95,27 +95,20 @@
 
 /* Special free list -- see comments for same code in intobject.c. */
 static PyFloatObject *free_list = NULL;
-static PyFloatObject *block_list = NULL;
 #define BLOCK_SIZE	1000	/* 1K less typical malloc overhead */
-#define N_FLOATOBJECTS	((BLOCK_SIZE - sizeof(PyFloatObject *)) / \
-			 sizeof(PyFloatObject))
-#define PyMem_MALLOC	malloc
-#define PyMem_FREE	free
+#define N_FLOATOBJECTS	(BLOCK_SIZE / sizeof(PyFloatObject))
 
 static PyFloatObject *
 fill_free_list()
 {
 	PyFloatObject *p, *q;
-	p = (PyFloatObject *)PyMem_MALLOC(BLOCK_SIZE);
+	p = PyMem_NEW(PyFloatObject, N_FLOATOBJECTS);
 	if (p == NULL)
 		return (PyFloatObject *)PyErr_NoMemory();
-	*(PyFloatObject **)p = block_list;
-	block_list = p;
-	p = (PyFloatObject *)((char *)p + sizeof(PyFloatObject *));
 	q = p + N_FLOATOBJECTS;
 	while (--q > p)
-		q->ob_type = (struct _typeobject *)(q-1);
-	q->ob_type = NULL;
+		*(PyFloatObject **)q = q-1;
+	*(PyFloatObject **)q = NULL;
 	return p + N_FLOATOBJECTS - 1;
 }
 
@@ -133,7 +126,7 @@
 			return NULL;
 	}
 	op = free_list;
-	free_list = (PyFloatObject *)op->ob_type;
+	free_list = *(PyFloatObject **)free_list;
 	op->ob_type = &PyFloat_Type;
 	op->ob_fval = fval;
 	_Py_NewReference(op);
@@ -144,7 +137,7 @@
 float_dealloc(op)
 	PyFloatObject *op;
 {
-	op->ob_type = (struct _typeobject *)free_list;
+	*(PyFloatObject **)op = free_list;
 	free_list = op;
 }
 
@@ -611,47 +604,5 @@
 void
 PyFloat_Fini()
 {
-	PyFloatObject *p, *list;
-	int i;
-	int bc, bf;	/* block count, number of freed blocks */
-	int frem, fsum;	/* remaining unfreed floats per block, total */
-
-	bc = 0;
-	bf = 0;
-	fsum = 0;
-	list = block_list;
-	block_list = NULL;
-	while (list != NULL) {
-		p = list;
-		p = (PyFloatObject *)((char *)p + sizeof(PyFloatObject *));
-		bc++;
-		frem = 0;
-		for (i = 0; i < N_FLOATOBJECTS; i++, p++) {
-			if (PyFloat_Check(p) && p->ob_refcnt != 0)
-				frem++;
-		}
-		p = list;
-		list = *(PyFloatObject **)p;
-		if (frem) {
-			*(PyFloatObject **)p = block_list;
-			block_list = p;
-		}
-		else {
-			PyMem_FREE(p);
-			bf++;
-		}
-		fsum += frem;
-	}
-	if (Py_VerboseFlag) {
-		fprintf(stderr, "# cleanup floats");
-		if (!fsum) {
-			fprintf(stderr, "\n");
-		}
-		else {
-			fprintf(stderr,
-			    ": %d unfreed float%s in %d out of %d block%s\n",
-				fsum, fsum == 1 ? "" : "s",
-				bc - bf, bc, bc == 1 ? "" : "s");
-		}
-	}
+	/* XXX Alas, the free list is not easily and safely freeable */
 }