allow classes as exceptions
diff --git a/Python/ceval.c b/Python/ceval.c
index c7fa697..fb1c0e7 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -783,13 +783,33 @@
 				u = w;
 				w = gettupleitem(u, 0);
 				INCREF(w);
+				INCREF(w);
 				DECREF(u);
 			}
-			if (!is_stringobject(w))
-				err_setstr(TypeError,
-					"exceptions must be strings");
-			else
+			if (is_stringobject(w)) {
 				err_setval(w, v);
+			} else if (is_classobject(w)) {
+				if (!is_instanceobject(v)
+				    || !issubclass((object*)((instanceobject*)v)->in_class,
+						   w))
+					err_setstr(TypeError,
+						   "a class exception must have a value that is an instance of the class");
+				else
+					err_setval(w,v);
+			} else if (is_instanceobject(w)) {
+				if (v != None)
+					err_setstr(TypeError,
+						   "an instance exception may not have a separate value");
+				else {
+					DECREF(v);
+					v = w;
+					w = (object*) ((instanceobject*)w)->in_class;
+					INCREF(w);
+					err_setval(w, v);
+				}
+			} else
+				err_setstr(TypeError,
+					"exceptions must be strings, classes, or instances");
 			DECREF(v);
 			DECREF(w);
 			why = WHY_EXCEPTION;
@@ -2393,6 +2413,8 @@
 		}
 		return 0;
 	}
+	if (is_classobject(v) && is_classobject(err))
+		return issubclass(err, v);
 	return err == v;
 }