diff --git a/CHANGES.rst b/CHANGES.rst
index c0226e2..d7ed057 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,7 +4,9 @@ Changelog
 4.9 (unreleased)
 ----------------
 
-- Nothing changed yet.
+- On CPython no longer omit compiling the C code when ``PURE_PYTHON`` is
+  required. Just evaluate it at runtime.
+  (`#53 <https://github.com/zopefoundation/Acquisition/issues/53>`_)
 
 
 4.8 (2021-07-20)
diff --git a/setup.py b/setup.py
index 4ab4ed7..0de7c4f 100644
--- a/setup.py
+++ b/setup.py
@@ -26,8 +26,7 @@ with open('CHANGES.rst') as f:
 # PyPy won't build the extension.
 py_impl = getattr(platform, 'python_implementation', lambda: None)
 is_pypy = py_impl() == 'PyPy'
-is_pure = 'PURE_PYTHON' in os.environ
-if is_pypy or is_pure:
+if is_pypy:
     ext_modules = []
 else:
     ext_modules = [
@@ -53,7 +52,9 @@ setup(
     classifiers=[
         "Development Status :: 6 - Mature",
         "Environment :: Web Environment",
-        "Framework :: Zope2",
+        "Framework :: Zope :: 2",
+        "Framework :: Zope :: 4",
+        "Framework :: Zope :: 5",
         "License :: OSI Approved :: Zope Public License",
         "Operating System :: OS Independent",
         "Programming Language :: Python",
diff --git a/src/Acquisition/__init__.py b/src/Acquisition/__init__.py
index d82f6b7..6a23ffa 100644
--- a/src/Acquisition/__init__.py
+++ b/src/Acquisition/__init__.py
@@ -4,7 +4,6 @@ from __future__ import absolute_import, print_function
 
 
 import os
-import operator
 import platform
 import sys
 import types
@@ -18,12 +17,9 @@ from .interfaces import IAcquirer
 from .interfaces import IAcquisitionWrapper
 
 IS_PYPY = getattr(platform, 'python_implementation', lambda: None)() == 'PyPy'
-IS_PURE = 'PURE_PYTHON' in os.environ
-
-
+IS_PURE = int(os.environ.get('PURE_PYTHON', '0'))
+CAPI = not (IS_PYPY or IS_PURE)
 Acquired = "<Special Object Used to Force Acquisition>"
-
-
 _NOT_FOUND = object()  # marker
 
 ###
@@ -917,7 +913,7 @@ def aq_inContextOf(self, o, inner=True):
     return False
 
 
-if not (IS_PYPY or IS_PURE):  # pragma: no cover
+if CAPI:  # pragma: no cover
     # Make sure we can import the C extension of our dependency.
     from ExtensionClass import _ExtensionClass  # NOQA
     from ._Acquisition import *  # NOQA

diff --git a/src/Acquisition/tests.py b/src/Acquisition/tests.py
index af70b8d..aa96acc 100644
--- a/src/Acquisition/tests.py
+++ b/src/Acquisition/tests.py
@@ -35,6 +35,7 @@ from Acquisition import (  # NOQA
     aq_self,
     Explicit,
     Implicit,
+    CAPI,
     IS_PYPY,
     IS_PURE,
     _Wrapper,
@@ -3282,18 +3283,15 @@ class TestProxying(unittest.TestCase):
 
         self.assertEqual(base.derived(1, k=2), (42, 1, 2))
 
-        if not IS_PYPY:
-            # XXX: This test causes certain versions
-            # of PyPy to segfault (at least 2.6.0-alpha1)
-            class NotCallable(base_class):
-                pass
+        class NotCallable(base_class):
+            pass
 
-            base.derived = NotCallable()
-            try:
-                base.derived()
-                self.fail("Not callable")
-            except (TypeError, AttributeError):
-                pass
+        base.derived = NotCallable()
+        try:
+            base.derived()
+            self.fail("Not callable")
+        except (TypeError, AttributeError):
+            pass
 
     def test_implicit_proxy_call(self):
         self._check_call()
@@ -3416,19 +3414,18 @@ class TestProxying(unittest.TestCase):
 
 class TestCompilation(unittest.TestCase):
 
-    def test_compile(self):
-        if IS_PYPY or IS_PURE:
-            # the test wants to verify that in a Python only
-            # setup, the C extension is not generated.
-            # However, for efficiency reasons, the tests are usually
-            # run in a shared environment, and the test would fail
-            # as the C extension is available
-            pass
-##            with self.assertRaises((AttributeError, ImportError)):
-##                from Acquisition import _Acquisition
-        else:
+    def test_compilation(self):
+        self.assertEqual(CAPI, not (IS_PYPY or IS_PURE))
+        try:
             from Acquisition import _Acquisition
+            cExplicit = _Acquisition.Explicit
+        except ImportError:
+            cExplicit = None  # PyPy never has a C module.
+        if CAPI:  # pragma: no cover
             self.assertTrue(hasattr(_Acquisition, 'AcquisitionCAPI'))
+            self.assertEqual(Explicit, cExplicit)
+        else:
+            self.assertNotEqual(Explicit, cExplicit)
 
 
 def test_suite():

Stop checking PURE_PYTHON at build (setup.py) time
This leads to incorrect wheel building. (See https://github.com/zopefoundation/Persistence/issues/27)

Additionally https://github.com/zopefoundation/Acquisition/pull/52/commits/d91643f0d75a7c3ec76e9fe974417beb9d1086e1 could be fixed like https://github.com/zopefoundation/Persistence/pull/26/commits/6645417c325798c7ed04d271626c3936f8b3750a
src/Acquisition/tests.py::TestStory::test_story src/Acquisition/tests.py::test_unwrapped src/Acquisition/tests.py::test_simple src/Acquisition/tests.py::test_muliple src/Acquisition/tests.py::test_pinball src/Acquisition/tests.py::test_explicit src/Acquisition/tests.py::test_mixed_explicit_and_explicit src/Acquisition/tests.py::TestAqAlgorithm::test_AqAlg src/Acquisition/tests.py::TestExplicitAcquisition::test_explicit_acquisition src/Acquisition/tests.py::TestCreatingWrappers::test_creating_wrappers_directly src/Acquisition/tests.py::TestPickle::test_cant_persist_acquisition_wrappers_classic src/Acquisition/tests.py::TestPickle::test_cant_persist_acquisition_wrappers_newstyle src/Acquisition/tests.py::TestPickle::test_cant_pickle_acquisition_wrappers_classic src/Acquisition/tests.py::TestPickle::test_cant_pickle_acquisition_wrappers_newstyle src/Acquisition/tests.py::TestInterfaces::test_interfaces src/Acquisition/tests.py::TestMixin::test_mixin_base src/Acquisition/tests.py::TestMixin::test_mixin_post_class_definition src/Acquisition/tests.py::TestGC::test_Basic_gc src/Acquisition/tests.py::TestGC::test_Wrapper_gc src/Acquisition/tests.py::test_container_proxying src/Acquisition/tests.py::TestAqParentParentInteraction::test___parent__no_wrappers src/Acquisition/tests.py::TestAqParentParentInteraction::test_explicit_wrapper_as___parent__ src/Acquisition/tests.py::TestAqParentParentInteraction::test_explicit_wrapper_has_nonwrapper_as_aq_parent src/Acquisition/tests.py::TestAqParentParentInteraction::test_implicit_wrapper_as___parent__ src/Acquisition/tests.py::TestAqParentParentInteraction::test_implicit_wrapper_has_nonwrapper_as_aq_parent src/Acquisition/tests.py::TestParentCircles::test___parent__aq_parent_circles src/Acquisition/tests.py::TestParentCircles::test_unwrapped_implicit_acquirer_unwraps__parent__ src/Acquisition/tests.py::TestBugs::test__cmp__ src/Acquisition/tests.py::TestBugs::test__iter__after_AttributeError src/Acquisition/tests.py::TestBugs::test_bool src/Acquisition/tests.py::TestBugs::test_wrapped_attr src/Acquisition/tests.py::TestSpecialNames::test_special_names src/Acquisition/tests.py::TestWrapper::test_AttributeError_if_object_has_no__bytes__ src/Acquisition/tests.py::TestWrapper::test__bytes__is_correcty_wrapped src/Acquisition/tests.py::TestWrapper::test__cmp__is_called_on_wrapped_object src/Acquisition/tests.py::TestWrapper::test_cannot_set_attributes_on_empty_wrappers src/Acquisition/tests.py::TestWrapper::test_deleting_parent_attrs src/Acquisition/tests.py::TestWrapper::test_getitem_setitem_implemented src/Acquisition/tests.py::TestWrapper::test_getitem_setitem_not_implemented src/Acquisition/tests.py::TestWrapper::test_wrapped_methods_have_correct_self src/Acquisition/tests.py::TestWrapper::test_wrapped_objects_are_unwrapped_on_set src/Acquisition/tests.py::TestOf::test__of__exception src/Acquisition/tests.py::TestOf::test_wrapper_calls_of_on_non_wrapper src/Acquisition/tests.py::TestAQInContextOf::test_aq_inContextOf src/Acquisition/tests.py::TestAQInContextOf::test_aq_inContextOf_odd_cases src/Acquisition/tests.py::TestCircles::test_parent_parent_circles src/Acquisition/tests.py::TestCircles::test_parent_parent_parent_circles src/Acquisition/tests.py::TestCircles::test_search_repeated_objects src/Acquisition/tests.py::TestAcquire::test_explicit_module_default src/Acquisition/tests.py::TestAcquire::test_explicit_module_false src/Acquisition/tests.py::TestAcquire::test_explicit_module_true src/Acquisition/tests.py::TestAcquire::test_explicit_wrapper_default src/Acquisition/tests.py::TestAcquire::test_explicit_wrapper_false src/Acquisition/tests.py::TestAcquire::test_explicit_wrapper_true src/Acquisition/tests.py::TestAcquire::test_no_wrapper_but___parent___falls_back_to_default src/Acquisition/tests.py::TestAcquire::test_unwrapped_falls_back_to_default src/Acquisition/tests.py::TestAcquire::test_w_unicode_attr_name src/Acquisition/tests.py::TestAcquire::test_wrapper_falls_back_to_default src/Acquisition/tests.py::TestCooperativeBase::test_explicit___getattribute__is_cooperative src/Acquisition/tests.py::TestCooperativeBase::test_implicit___getattribute__is_cooperative src/Acquisition/tests.py::TestUnicode::test_explicit_aq_unicode_should_be_called src/Acquisition/tests.py::TestUnicode::test_explicit_should_fall_back_to_str src/Acquisition/tests.py::TestUnicode::test_implicit_aq_unicode_should_be_called src/Acquisition/tests.py::TestUnicode::test_implicit_should_fall_back_to_str src/Acquisition/tests.py::TestUnicode::test_str_fallback_should_be_called_with_wrapped_self src/Acquisition/tests.py::TestUnicode::test_unicode_should_be_called_with_wrapped_self src/Acquisition/tests.py::TestProxying::test_explicit_proxy_bool src/Acquisition/tests.py::TestProxying::test_explicit_proxy_call src/Acquisition/tests.py::TestProxying::test_explicit_proxy_comporison src/Acquisition/tests.py::TestProxying::test_explicit_proxy_contains src/Acquisition/tests.py::TestProxying::test_explicit_proxy_hash src/Acquisition/tests.py::TestProxying::test_explicit_proxy_special_meths src/Acquisition/tests.py::TestProxying::test_implicit_proxy_bool src/Acquisition/tests.py::TestProxying::test_implicit_proxy_call src/Acquisition/tests.py::TestProxying::test_implicit_proxy_comporison src/Acquisition/tests.py::TestProxying::test_implicit_proxy_contains src/Acquisition/tests.py::TestProxying::test_implicit_proxy_hash src/Acquisition/tests.py::TestProxying::test_implicit_proxy_special_meths src/Acquisition/tests.py::TestCompilation::test_compilation src/Acquisition/tests.py::test_suite