diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index ed4c05b..f4a7802 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -2356,178 +2356,13 @@
 	{NULL,		NULL},
 };
 
-/* Predefined exceptions */
-
-PyObject *PyExc_Exception;
-PyObject *PyExc_StandardError;
-PyObject *PyExc_ArithmeticError;
-PyObject *PyExc_LookupError;
-
-PyObject *PyExc_AssertionError;
-PyObject *PyExc_AttributeError;
-PyObject *PyExc_EOFError;
-PyObject *PyExc_FloatingPointError;
-PyObject *PyExc_EnvironmentError;
-PyObject *PyExc_IOError;
-PyObject *PyExc_OSError;
-PyObject *PyExc_ImportError;
-PyObject *PyExc_IndexError;
-PyObject *PyExc_KeyError;
-PyObject *PyExc_KeyboardInterrupt;
-PyObject *PyExc_MemoryError;
-PyObject *PyExc_NameError;
-PyObject *PyExc_OverflowError;
-PyObject *PyExc_RuntimeError;
-PyObject *PyExc_NotImplementedError;
-PyObject *PyExc_SyntaxError;
-PyObject *PyExc_SystemError;
-PyObject *PyExc_SystemExit;
-PyObject *PyExc_UnboundLocalError;
-PyObject *PyExc_UnicodeError;
-PyObject *PyExc_TypeError;
-PyObject *PyExc_ValueError;
-PyObject *PyExc_ZeroDivisionError;
-#ifdef MS_WINDOWS
-PyObject *PyExc_WindowsError;
-#endif
-
-PyObject *PyExc_MemoryErrorInst;
-
-static struct
-{
-	char* name;
-	PyObject** exc;
-}
-bltin_exc[] = {
-	{"Exception",          &PyExc_Exception},
-	{"StandardError",      &PyExc_StandardError},
-	{"ArithmeticError",    &PyExc_ArithmeticError},
-	{"LookupError",        &PyExc_LookupError},
-	{"AssertionError",     &PyExc_AssertionError},
-	{"AttributeError",     &PyExc_AttributeError},
-	{"EOFError",           &PyExc_EOFError},
-	{"FloatingPointError", &PyExc_FloatingPointError},
-	{"EnvironmentError",   &PyExc_EnvironmentError},
-	{"IOError",            &PyExc_IOError},
-	{"OSError",            &PyExc_OSError},
-	{"ImportError",        &PyExc_ImportError},
-	{"IndexError",         &PyExc_IndexError},
-	{"KeyError",           &PyExc_KeyError},
-	{"KeyboardInterrupt",  &PyExc_KeyboardInterrupt},
-	{"MemoryError",        &PyExc_MemoryError},
-	{"NameError",          &PyExc_NameError},
-	{"OverflowError",      &PyExc_OverflowError},
-	{"RuntimeError",       &PyExc_RuntimeError},
- 	{"NotImplementedError",&PyExc_NotImplementedError},
-	{"SyntaxError",        &PyExc_SyntaxError},
-	{"SystemError",        &PyExc_SystemError},
-	{"SystemExit",         &PyExc_SystemExit},
-	{"UnboundLocalError",  &PyExc_UnboundLocalError},
-	{"UnicodeError",       &PyExc_UnicodeError},
-	{"TypeError",          &PyExc_TypeError},
-	{"ValueError",         &PyExc_ValueError},
-#ifdef MS_WINDOWS
-	{"WindowsError",       &PyExc_WindowsError},
-#endif
-	{"ZeroDivisionError",  &PyExc_ZeroDivisionError},
-	{NULL, NULL}
-};
-
-
-/* Import exceptions module to extract class exceptions.  On success,
- * return 1.  On failure return 0 which signals _PyBuiltin_Init_2 to
- * issue a fatal error.
- */
-static int
-init_class_exc(dict)
-	PyObject *dict;
-{
-	int i;
-	PyObject *m = PyImport_ImportModule("exceptions");
-	PyObject *args = NULL;
-	PyObject *d = NULL;
-
-	/* make sure we got the module and its dictionary */
-	if (m == NULL ||
-	    (d = PyModule_GetDict(m)) == NULL)
-	{
-		PySys_WriteStderr("'import exceptions' failed\n");
-		goto finally;
-	}
-	for (i = 0; bltin_exc[i].name; i++) {
-		/* dig the exception out of the module */
-		PyObject *exc = PyDict_GetItemString(d, bltin_exc[i].name);
-		if (!exc) {
-			PySys_WriteStderr(
-		"Built-in exception class not found: %s.  Library mismatch?\n",
-		bltin_exc[i].name);
-			goto finally;
-		}
-		/* free the old-style exception string object */
-		Py_XDECREF(*bltin_exc[i].exc);
-
-		/* squirrel away a pointer to the exception */
-		Py_INCREF(exc);
-		*bltin_exc[i].exc = exc;
-
-		/* and insert the name in the __builtin__ module */
-		if (PyDict_SetItemString(dict, bltin_exc[i].name, exc)) {
-			PySys_WriteStderr(
-			      "Cannot insert exception into __builtin__: %s\n",
-			      bltin_exc[i].name);
-			goto finally;
-		}
-	}
-
-	/* we need one pre-allocated instance */
-	args = Py_BuildValue("()");
-	if (!args ||
-	    !(PyExc_MemoryErrorInst =
-	      PyEval_CallObject(PyExc_MemoryError, args)))
-	{
-	       PySys_WriteStderr("Cannot pre-allocate MemoryError instance\n");
-	       goto finally;
-	}
-	Py_DECREF(args);
-
-	/* we're done with the exceptions module */
-	Py_DECREF(m);
-	return 1;
-
-  finally:
-	Py_XDECREF(m);
-	Py_XDECREF(args);
-	PyErr_Clear();
-	return 0;
-}
-
-
-static void
-fini_instances()
-{
-	Py_XDECREF(PyExc_MemoryErrorInst);
-	PyExc_MemoryErrorInst = NULL;
-}
-
-
-static void
-finierrors()
-{
-	int i;
-	for (i = 0; bltin_exc[i].name; i++) {
-		PyObject *exc = *bltin_exc[i].exc;
-		Py_XDECREF(exc);
-		*bltin_exc[i].exc = NULL;
-	}
-}
-
 static char builtin_doc[] =
 "Built-in functions, exceptions, and other objects.\n\
 \n\
 Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
 
 PyObject *
-_PyBuiltin_Init_1()
+_PyBuiltin_Init()
 {
 	PyObject *mod, *dict;
 	mod = Py_InitModule4("__builtin__", builtin_methods,
@@ -2547,30 +2382,6 @@
 	return mod;
 }
 
-void
-_PyBuiltin_Init_2(dict)
-	PyObject *dict;
-{
-	if (!init_class_exc(dict))
-		/* class based exceptions could not be initialized. */
-		Py_FatalError("Standard exceptions could not be initialized.");
-}
-
-
-void
-_PyBuiltin_Fini_1()
-{
-	fini_instances();
-}
-
-
-void
-_PyBuiltin_Fini_2()
-{
-	finierrors();
-}
-
-
 /* Helper for filter(): filter a tuple through a function */
 
 static PyObject *
