diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index e1b90723..b632a083 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -4,6 +4,11 @@ Changelog
 3.0.0rc2 (unreleased)
 +++++++++++++++++++++
 
+Features:
+
+- Add ``register`` *class Meta* option to allow bypassing marshmallow's
+  internal class registry when memory usage is critical (:issue:`660`).
+
 Bug fixes:
 
 - Fix serializing dict-like objects with properties (:issue:`1060`).
diff --git a/marshmallow/schema.py b/marshmallow/schema.py
index fcbe8849..93167ba5 100644
--- a/marshmallow/schema.py
+++ b/marshmallow/schema.py
@@ -137,7 +137,7 @@ class SchemaMeta(type):
     # NOTE: self is the class object
     def __init__(self, name, bases, attrs):
         super(SchemaMeta, self).__init__(name, bases, attrs)
-        if name:
+        if name and self.opts.register:
             class_registry.register(name, self)
         self._hooks = self.resolve_hooks()
 
@@ -216,6 +216,7 @@ class SchemaOpts(object):
         self.load_only = getattr(meta, 'load_only', ())
         self.dump_only = getattr(meta, 'dump_only', ())
         self.unknown = getattr(meta, 'unknown', RAISE)
+        self.register = getattr(meta, 'register', True)
 
 
 class BaseSchema(base.SchemaABC):
@@ -329,6 +330,10 @@ class BaseSchema(base.SchemaABC):
         - ``dump_only``: Tuple or list of fields to exclude from deserialization
         - ``unknown``: Whether to exclude, include, or raise an error for unknown
             fields in the data. Use `EXCLUDE`, `INCLUDE` or `RAISE`.
+        - ``register``: Whether to register the `Schema` with marshmallow's internal
+            class registry. Must be `True` if you intend to refer to this `Schema`
+            by class name in `Nested` fields. Only set this to `False` when memory
+            usage is critical. Defaults to `True`.
         """
         pass
 

Proposal: Add a class Meta option to prevent adding a class to the internal registry
## Purpose 

Implement a way to bypass marshmallow's internal class registry when it isn't necessary in order to optimize memory usage.


## Proposed API

```python
class MyNonRegisteredSchema(Schema):
    class Meta:
        register = False
```

diff --git a/tests/test_registry.py b/tests/test_registry.py
index b54f5ebe..16234259 100644
--- a/tests/test_registry.py
+++ b/tests/test_registry.py
@@ -21,6 +21,36 @@ def test_serializer_has_class_registry():
     assert 'tests.test_registry.MySubSchema' in class_registry._registry
 
 
+def test_register_class_meta_option():
+    class UnregisteredSchema(Schema):
+        class Meta:
+            register = False
+
+    class RegisteredSchema(Schema):
+        class Meta:
+            register = True
+
+    class RegisteredOverrideSchema(UnregisteredSchema):
+        class Meta:
+            register = True
+
+    class UnregisteredOverrideSchema(RegisteredSchema):
+        class Meta:
+            register = False
+
+    assert 'UnregisteredSchema' not in class_registry._registry
+    assert 'tests.test_registry.UnregisteredSchema' not in class_registry._registry
+
+    assert 'RegisteredSchema' in class_registry._registry
+    assert 'tests.test_registry.RegisteredSchema' in class_registry._registry
+
+    assert 'RegisteredOverrideSchema' in class_registry._registry
+    assert 'tests.test_registry.RegisteredOverrideSchema' in class_registry._registry
+
+    assert 'UnregisteredOverrideSchema' not in class_registry._registry
+    assert 'tests.test_registry.UnregisteredOverrideSchema' not in class_registry._registry
+
+
 def test_serializer_class_registry_register_same_classname_different_module():
 
     reglen = len(class_registry._registry)

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
aspy.yaml==1.3.0
cached-property==2.0.1
cachetools==5.5.2
cfgv==3.4.0
chardet==5.2.0
colorama==0.4.6
distlib==0.3.9
exceptiongroup==1.2.2
filelock==3.18.0
flake8==3.6.0
identify==2.6.9
importlib_metadata==8.6.1
iniconfig==2.1.0
-e git+https://github.com/marshmallow-code/marshmallow.git@09855418261af6faa74764b0af3a90944ab673c6#egg=marshmallow
mccabe==0.6.1
nodeenv==1.9.1
packaging==24.2
platformdirs==4.3.7
pluggy==1.5.0
pre-commit==1.13.0
pycodestyle==2.4.0
pyflakes==2.0.0
pyproject-api==1.9.0
pytest==8.3.5
python-dateutil==2.9.0.post0
pytz==2025.2
PyYAML==6.0.2
simplejson==3.20.1
six==1.17.0
toml==0.10.2
tomli==2.2.1
tox==4.25.0
typing_extensions==4.13.0
virtualenv==20.29.3
zipp==3.21.0

name: marshmallow
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - aspy-yaml==1.3.0
      - cached-property==2.0.1
      - cachetools==5.5.2
      - cfgv==3.4.0
      - chardet==5.2.0
      - colorama==0.4.6
      - distlib==0.3.9
      - exceptiongroup==1.2.2
      - filelock==3.18.0
      - flake8==3.6.0
      - identify==2.6.9
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - mccabe==0.6.1
      - nodeenv==1.9.1
      - packaging==24.2
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - pre-commit==1.13.0
      - pycodestyle==2.4.0
      - pyflakes==2.0.0
      - pyproject-api==1.9.0
      - pytest==8.3.5
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyyaml==6.0.2
      - simplejson==3.20.1
      - six==1.17.0
      - toml==0.10.2
      - tomli==2.2.1
      - tox==4.25.0
      - typing-extensions==4.13.0
      - virtualenv==20.29.3
      - zipp==3.21.0
prefix: /opt/conda/envs/marshmallow

tests/test_registry.py::test_register_class_meta_option
tests/test_registry.py::test_serializer_has_class_registry tests/test_registry.py::test_serializer_class_registry_register_same_classname_different_module tests/test_registry.py::test_serializer_class_registry_override_if_same_classname_same_module tests/test_registry.py::test_two_way_nesting tests/test_registry.py::test_nesting_with_class_name_many tests/test_registry.py::test_invalid_class_name_in_nested_field_raises_error tests/test_registry.py::test_multiple_classes_with_same_name_raises_error tests/test_registry.py::test_multiple_classes_with_all tests/test_registry.py::test_can_use_full_module_path_to_class
CHANGELOG.rst marshmallow/schema.py
CHANGELOG.rst marshmallow/schema.py