PyModule_AddObject steals a reference.  Fix all of the double calls to it by adding a Py_INCREF.  Also, some other assorted hacks which probably shouldn't be necessary but are at the moment.
diff --git a/src/ssl/connection.c b/src/ssl/connection.c
index 6ee484d..ec15a3c 100755
--- a/src/ssl/connection.c
+++ b/src/ssl/connection.c
@@ -1413,6 +1413,9 @@
         return 0;
     }
 
+    /* PyModule_AddObject steals a reference.
+     */
+    Py_INCREF((PyObject *)&ssl_Connection_Type);
     if (PyModule_AddObject(module, "Connection", (PyObject *)&ssl_Connection_Type) != 0) {
         return 0;
     }
diff --git a/src/ssl/context.c b/src/ssl/context.c
index ebaf164..ce23f95 100644
--- a/src/ssl/context.c
+++ b/src/ssl/context.c
@@ -1299,6 +1299,9 @@
         return 0;
     }
 
+    /* PyModule_AddObject steals a reference.
+     */
+    Py_INCREF((PyObject *)&ssl_Context_Type);
     if (PyModule_AddObject(module, "Context", (PyObject *)&ssl_Context_Type) < 0) {
         return 0;
     }
diff --git a/src/ssl/ssl.c b/src/ssl/ssl.c
index 94d4844..1f12d67 100644
--- a/src/ssl/ssl.c
+++ b/src/ssl/ssl.c
@@ -92,8 +92,12 @@
 } while (0)
 
     ssl_Error = PyErr_NewException("OpenSSL.SSL.Error", NULL, NULL);
-    if (ssl_Error == NULL)
+    if (ssl_Error == NULL) {
         goto error;
+    }
+    /* XXX PyPy hack */
+    Py_INCREF(ssl_Error);
+
     if (PyModule_AddObject(module, "Error", ssl_Error) != 0)
         goto error;