New Upstream Release - python-traits

Ready changes

Summary

Merged new upstream version: 6.4.1 (was: 6.3.2).

Resulting package

Built on 2023-01-07T18:12 (took 10m17s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases python3-traits-dbgsymapt install -t fresh-releases python3-traits

Lintian Result

Diff

diff --git a/.github/workflows/release-to-pypi.yml b/.github/workflows/release-to-pypi.yml
index c2668cb..44824fc 100644
--- a/.github/workflows/release-to-pypi.yml
+++ b/.github/workflows/release-to-pypi.yml
@@ -35,7 +35,7 @@ jobs:
         python -m pip install twine wheel
 
     - name: Build wheels
-      uses: pypa/cibuildwheel@v2.1.2
+      uses: pypa/cibuildwheel@v2.9.0
       env:
         CIBW_SKIP: 'pp*'
         CIBW_ARCHS_LINUX: "auto aarch64"
diff --git a/.github/workflows/run-core-traits-tests.yml b/.github/workflows/run-core-traits-tests.yml
index 0f9d178..3688286 100644
--- a/.github/workflows/run-core-traits-tests.yml
+++ b/.github/workflows/run-core-traits-tests.yml
@@ -11,7 +11,7 @@ jobs:
     strategy:
       matrix:
         os: [ubuntu-latest, windows-latest]
-        python-version: ['3.6', '3.7', '3.8', '3.9', '3.10']
+        python-version: ['3.6', '3.7', '3.8', '3.9', '3.10', '3.11-dev']
 
     runs-on: ${{ matrix.os }}
 
@@ -23,9 +23,14 @@ jobs:
         python-version: ${{ matrix.python-version }}
     - name: Install local package
       run: |
-        python -m pip install --upgrade pip setuptools wheel
+        python -m pip install --upgrade pip
+        # Uninstall setuptools so that the tests will catch any accidental
+        # dependence of the Traits source on setuptools. Note that in future
+        # setuptools may not exist in a newly-created venv
+        # https://github.com/python/cpython/issues/95299
+        python -m pip uninstall -y setuptools
         python -m pip install .
-        python -m pip uninstall -y setuptools wheel
+        python -m pip list
     - name: Test Traits package
       run: |
         mkdir testdir
diff --git a/.github/workflows/run-traits-tests.yml b/.github/workflows/run-traits-tests.yml
index 059f156..9f12a36 100644
--- a/.github/workflows/run-traits-tests.yml
+++ b/.github/workflows/run-traits-tests.yml
@@ -1,14 +1,15 @@
 name: Tests
 
 on:
-  pull_request
+- pull_request
+- workflow_dispatch
 
 jobs:
   tests:
     strategy:
       matrix:
         os: [ubuntu-latest, windows-latest, macos-latest]
-        python-version: ['3.6', '3.7', '3.8', '3.9', '3.10']
+        python-version: ['3.6', '3.7', '3.8', '3.9', '3.10', '3.11-dev']
 
     runs-on: ${{ matrix.os }}
 
@@ -32,7 +33,7 @@ jobs:
         python-version: ${{ matrix.python-version }}
     - name: Install dependencies and local packages
       run: |
-        python -m pip install --upgrade pip setuptools wheel
+        python -m pip install --upgrade pip
         python -m pip install .[test]
         python -m pip install traits-stubs/[test]
     - name: Create clean test directory
diff --git a/.github/workflows/test-documentation-build.yml b/.github/workflows/test-documentation-build.yml
index 1a563b8..9aa7dd3 100644
--- a/.github/workflows/test-documentation-build.yml
+++ b/.github/workflows/test-documentation-build.yml
@@ -21,7 +21,7 @@ jobs:
     - name: Install dependencies and local packages
       run: |
         python -m pip install --upgrade pip
-        python -m pip install Sphinx enthought_sphinx_theme
+        python -m pip install Sphinx enthought_sphinx_theme sphinx-copybutton
         python -m pip install .
     - name: Build HTML documentation with Sphinx
       run: |
diff --git a/.github/workflows/test-from-pypi.yml b/.github/workflows/test-from-pypi.yml
index fa67c1e..f94bbd0 100644
--- a/.github/workflows/test-from-pypi.yml
+++ b/.github/workflows/test-from-pypi.yml
@@ -11,7 +11,7 @@ jobs:
     strategy:
       matrix:
         os: [ubuntu-latest, windows-latest, macos-latest]
-        python-version: ['3.6', '3.7', '3.8', '3.9']
+        python-version: ['3.6', '3.7', '3.8', '3.9', '3.10', '3.11-dev']
         python-architecture: [x86, x64]
         exclude:
         - os: macos-latest
@@ -58,7 +58,7 @@ jobs:
     strategy:
       matrix:
         os: [ubuntu-latest, windows-latest, macos-latest]
-        python-version: ['3.6', '3.7', '3.8', '3.9']
+        python-version: ['3.6', '3.7', '3.8', '3.9', '3.10']
         python-architecture: [x86, x64]
         exclude:
         - os: macos-latest
@@ -109,7 +109,7 @@ jobs:
       - name: Notify Slack channel on failure
         uses: voxmedia/github-action-slack-notify-build@v1
         with:
-          channel_id: ${{ secrets.ETS_BOTS_SLACK_CHANNEL_ID }}
+          channel_id: ${{ secrets.ETS_SLACK_CHANNEL_ID }}
           status: FAILED
           color: danger
         env:
diff --git a/.gitignore b/.gitignore
index 631a7a9..5928fd5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,20 +1,20 @@
-.coverage.*
-# file types to ignore
+# Compiled Python bytecode
 *.pyc
+
+# Compiled C extensions
 *.pyd
 *.so
-*.enamlc
-*~
-.DS_Store
 
-# ignore the build directories
+# Build directories
 *.egg-info/
-build/
-dist/
-docs/build/
+/build/
+/dist/
+/traits-stubs/build/
+/traits-stubs/dist/
+/docs/build/
 
-# ignore mypy cache
-.mypy_cache/
+# Coverage artifacts
+/.coverage
 
-# Auto-generated by setup.py
-traits/version.py
+# Version file (auto-generated by setup.py)
+/traits/version.py
diff --git a/CHANGES.rst b/CHANGES.rst
index 3a05c98..c97d94a 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,6 +1,161 @@
 Traits CHANGELOG
 ================
 
+Release 6.4.1
+-------------
+
+Released: 2022-08-12
+
+This is a bugfix release that fixes wheel builds on Python 3.11 and
+fixes some distribution and testing issues with typing stubs.
+
+Fixes
+~~~~~
+* Update ``cibuildwheel`` to the latest version so that we get wheels for
+  Python 3.11. (#1711)
+* Rename ``requires_numpy_testing`` decorator to ``requires_numpy_typing``,
+  and have it check for ``numpy.typing``, not ``numpy.testing``. (#1710)
+* Fix missing ``numpy_examples`` directory in traits-stubs package data.
+  (#1709)
+
+
+Release 6.4.0
+-------------
+
+Released: 2022-08-12
+
+Traits 6.4 is a minor feature release of Traits, which focuses mainly on typing
+stub and documentation updates.
+
+Migrating from Traits 6.3
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Traits 6.4 should be largely backwards compatible with Traits 6.3, but there
+are a couple of things to watch out for.
+
+* Reminder: while the ``Either`` and ``Trait`` trait types are not yet formally
+  deprecated, the intention is to eventually deprecate and remove them.
+  Projects are encouraged to update their code to use ``Union`` instead.
+* Similarly, any uses of the ``Unicode`` trait type in your project should
+  be replaced with ``Str``.
+* Validation of items within a container (e.g., ``foos = List(MyTraitType)``)
+  now always matches the validation used for the item trait at top level (e.g.,
+  ``foo = MyTraitType``). Previously, the validation methods used could differ,
+  thanks to a bug in the container implementations. For most trait types this
+  will make no difference, but for the ``Tuple`` trait type this change has the
+  consequence that lists will no longer be accepted as valid for ``Tuple``
+  traits inside list items. See issue #1619 and PR #1625 for more information.
+* Related to the above: a top-level ``Tuple()`` trait declaration currently
+  accepts Python ``list`` objects, while a ``Tuple`` declaration with explicit
+  item types (for example ``Tuple(Int(), Int())``) does not. The support for
+  ``list`` objects in plain ``Tuple()`` is deprecated, and will be removed in a
+  future version of Traits. See PR #1627 for more information.
+
+Detailed PR-by-PR changes
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The following people contributed code changes for this release:
+
+* Caio Agiani
+* Steve Allen
+* Mark Dickinson
+* Sai Rahul Poruri
+* Corran Webster
+
+Features
+~~~~~~~~
+* ``ETSConfig`` attributes now support deletion. This makes it easier to make
+  temporary changes to ``ETSConfig`` attributes during unit testing. (#1670,
+  #1686)
+* ``Complex`` trait type validation is now more lenient: any type that
+  implements ``__complex__`` will be accepted. (#1594)
+* ``BaseFloat`` validation is now more lenient, and matches ``Float``
+  validation: ``BaseFloat`` now also accepts objects whose type has an
+  ``__index__`` method. (#1595)
+
+Changes
+~~~~~~~
+* An ``enumerate`` alias has been removed from ``traits.trait_base``. In the
+  unlikely event of code that imports ``enumerate`` from ``traits.trait_base``,
+  use the built-in ``enumerate`` instead. (#1681)
+* Fast validation tuples ``int_fast_validate``, ``float_fast_validate`` and
+  ``complex_fast_validate`` have been removed from the ``traits.trait_types``
+  module. (#1601)
+
+Fixes
+~~~~~
+* ``TraitListObject``, ``TraitDict`` object and ``TraitSetObject`` now use the
+  ``validate`` method of the appropriate ``CTrait`` instances to validate
+  items, keys and values. Previously the handler's ``validate`` method was
+  used; this gave buggy behaviour in cases where the handler's ``validate``
+  method differed from the actual validation in use. (#1625)
+* Fix specification of ``default_value`` that incorrectly disregarded
+  ``default_value_type``. (#1631)
+* Fix incorrect results from  ``clone_traits`` applied to ``List``, ``Dict``
+  and ``Set`` traits. (#1624)
+* The ``find_resource`` and ``store_resource`` tests are now skipped
+  if the ``pkg_resources`` module is not present in the environment. (#1679)
+* An ``ETSConfig`` test has been renamed so that it's properly picked up
+  by the test runner. (#1671)
+* Fix some ``ETSConfig`` tests that assume unittest as the test runner. (#1683)
+* Rename various test-related classes to avoid pytest trying to harvest test
+  methods from them. (#1684)
+* Overriding a default for a ``List`` or other collection trait in a subclass
+  now works as expected. Previously, the behaviour was unusably buggy. (#1645)
+
+Deprecations
+~~~~~~~~~~~~
+* ``Tuple`` traits currently accept Python ``list`` objects in some (but
+  not all) circumstances. That feature is deprecated, and will be removed
+  in a future version of Traits. (#1627)
+
+Type stubs
+~~~~~~~~~~
+* Add stubs for ``Array``, ``ArrayOrNone``, and ``CArray``. (#1682)
+* Fix various stubs for ``traits.trait_types``; add stubs for
+  ``traits.ctraits``. (#1661)
+* Fix that ``TraitError`` stubs weren't exposed at ``traits.api`` level.
+  (#1658)
+* Make ``Int`` and ``Float`` type stubs more accurate. (#1656)
+* Fix incorrect type stubs for the ``Dict`` trait type. (#1655)
+
+Documentation
+~~~~~~~~~~~~~
+* Make ``ETSConfig`` class documentation visible in the API docs. (#1688)
+* Add copy buttons to code samples in documentation. (#1651, #1653)
+* Document ``Date``, ``Datetime`` and ``Time`` trait types. (#1641)
+* Fix some missing mentions of ``Set`` in notification docs. (#1618)
+* Document the ``'some_trait.-'`` pattern for ``on_trait_change``. (#1592)
+* Document that ``Either`` should not be used in new code. (#1699)
+* Document that ``TraitPrefixMap`` and ``TraitPrefixList`` are deprecated.
+  (#1702)
+* Document that the Trait factory function should not be used in new code.
+  (#1700)
+* Miscellaneous minor fixes. (#1583, #1611, #1652, #1680)
+
+Build and continuous integration
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Don't collect traits-stubs tests under pytest. As a result of this
+  and other fixes, the test suite now passes under pytest. (#1690)
+* Update ``etstool.py`` for Python 3.8 support. Python 3.8 is now the
+  default Python version for builds. (#1694)
+* Use PySide6 for Python >= 3.8 instead of PySide2 in CI testing. (#1685)
+* Add ``pyproject.toml`` files for both Traits and traits-stubs. (#1689, #1676)
+* Add Python 3.11 to some workflow runs. (#1600, #1660, #1674)
+* Add Python 3.10 to install-from-PyPI workflow. (#1576)
+* Allow running the main test workflow manually. (#1607)
+* Switch Slack channel used to report GitHub Actions failures. (#1650)
+* Exclude ``build`` directory in flake8 configuration. (#1635)
+* Re-include NumPy as a test dependency on Python 3.10. (#1593)
+
+Maintenance and refactoring
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* ``.gitignore`` cleanup and updates. (#1678, #1687)
+* Return ``PyErr_Format`` calls in ``traits/ctraits.c``. (#1640)
+* Update copyright header end year to 2022. (#1612)
+* The ``ci-src-requirements.txt`` file isn't used; remove it. (#1602)
+
+
 Release 6.3.2
 -------------
 
@@ -1484,7 +1639,7 @@ Fixes
 
 * Fix race condition when removing a traits listener. (#57)
 * Fix ugly interaction between DelegatesTo change handlers, dynamic change
-  handlers and two levels of dynamic intialization. (#63)
+  handlers and two levels of dynamic initialization. (#63)
 * Use a NullHandler for all 'traits' loggers. (#64)
 * Fix race condition in TraitChangeNotifyWrapper.listener_deleted (#66)
 * Fix leaking notifiers. (#68)
diff --git a/LICENSE.txt b/LICENSE.txt
index 53222af..3b41cd6 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,7 +1,7 @@
 This software is OSI Certified Open Source Software.
 OSI Certified is a certification mark of the Open Source Initiative.
 
-(C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+(C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/ci-src-requirements.txt b/ci-src-requirements.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/debian/changelog b/debian/changelog
index 8fe9624..3470d99 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,9 @@
-python-traits (6.3.2-2) UNRELEASED; urgency=medium
+python-traits (6.4.1-1) UNRELEASED; urgency=medium
 
   * Update standards version to 4.6.2, no changes needed.
+  * New upstream release.
 
- -- Debian Janitor <janitor@jelmer.uk>  Sat, 07 Jan 2023 12:53:50 -0000
+ -- Debian Janitor <janitor@jelmer.uk>  Sat, 07 Jan 2023 18:05:02 -0000
 
 python-traits (6.3.2-1) unstable; urgency=low
 
diff --git a/debian/patches/ignore_failing_test_store_resource_deprecated.patch b/debian/patches/ignore_failing_test_store_resource_deprecated.patch
index 3f844e9..956a77c 100644
--- a/debian/patches/ignore_failing_test_store_resource_deprecated.patch
+++ b/debian/patches/ignore_failing_test_store_resource_deprecated.patch
@@ -3,9 +3,11 @@ Last-Update: Tue, 08 Feb 2022 10:39:59 +0100
 Description: Ignore test which fails for unknown reasons for the moment
   FIXME: Closer inspection should be done
 
---- a/traits/util/tests/test_resource.py
-+++ b/traits/util/tests/test_resource.py
-@@ -25,11 +25,3 @@ class TestResource(unittest.TestCase):
+Index: python-traits.git/traits/util/tests/test_resource.py
+===================================================================
+--- python-traits.git.orig/traits/util/tests/test_resource.py
++++ python-traits.git/traits/util/tests/test_resource.py
+@@ -27,11 +27,3 @@ class TestResource(unittest.TestCase):
                  os.path.join("traits", "__init__.py"),
              )
  
diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst
index 1cb32f6..d76c92b 100644
--- a/docs/source/changelog.rst
+++ b/docs/source/changelog.rst
@@ -1 +1 @@
-.. include:: ../../CHANGES.rst
\ No newline at end of file
+.. include:: ../../CHANGES.rst
diff --git a/docs/source/conf.py b/docs/source/conf.py
index cf249d4..7d4d2ee 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -46,6 +46,7 @@ extensions = [
     "sphinx.ext.intersphinx",
     "sphinx.ext.napoleon",
     "sphinx.ext.viewcode",
+    "sphinx_copybutton",
     "traits.util.trait_documenter",
 ]
 
@@ -61,7 +62,7 @@ master_doc = "index"
 # General substitutions.
 project = "traits"
 copyright = """\
-(C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+(C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 All rights reserved.
 """
 
@@ -116,7 +117,6 @@ autodoc_default_options = {
 
 autodoc_member_order = "bysource"
 
-
 # Options for HTML output
 # -----------------------
 
diff --git a/docs/source/traits_api_reference/trait_handlers.rst b/docs/source/traits_api_reference/trait_handlers.rst
index b3b0336..2aa7758 100644
--- a/docs/source/traits_api_reference/trait_handlers.rst
+++ b/docs/source/traits_api_reference/trait_handlers.rst
@@ -32,11 +32,11 @@ Private Functions
 Deprecated Handlers
 -------------------
 
-.. deprecated:: 6.0.0
-
 The following :class:`~.TraitHandler` classes and instances are deprecated,
 and may be removed in a future version of Traits.
 
+.. deprecated:: 6.0.0
+
 .. autoclass:: TraitDict
 
 .. autoclass:: TraitList
diff --git a/docs/source/traits_api_reference/trait_types.rst b/docs/source/traits_api_reference/trait_types.rst
index ab2ecb5..491f1ff 100644
--- a/docs/source/traits_api_reference/trait_types.rst
+++ b/docs/source/traits_api_reference/trait_types.rst
@@ -238,10 +238,11 @@ Traits
 .. autoclass:: ToolbarButton
    :show-inheritance:
 
-.. autoclass:: Either
+.. autoclass:: Union
    :show-inheritance:
 
-.. autoclass:: Union
+.. autoclass:: Either
+   :show-inheritance:
 
 .. autoclass:: Symbol
    :show-inheritance:
diff --git a/docs/source/traits_api_reference/traits.etsconfig.rst b/docs/source/traits_api_reference/traits.etsconfig.rst
index 37a9dba..6f00fc6 100644
--- a/docs/source/traits_api_reference/traits.etsconfig.rst
+++ b/docs/source/traits_api_reference/traits.etsconfig.rst
@@ -10,4 +10,6 @@
 .. automodule:: traits.etsconfig.etsconfig
     :no-members:
 
+.. autoclass:: ETSConfigType
+
 .. autodata:: ETSConfig
diff --git a/docs/source/traits_user_manual/advanced.rst b/docs/source/traits_user_manual/advanced.rst
index 44b426a..da43038 100644
--- a/docs/source/traits_user_manual/advanced.rst
+++ b/docs/source/traits_user_manual/advanced.rst
@@ -1531,4 +1531,4 @@ the tool is justified and appropriate.
    # substitutions
 
 .. |HasTraits.observe| replace:: :func:`~traits.has_traits.HasTraits.observe`
-.. |@cached_property| replace:: :func:`~traits.has_traits.cached_property`
\ No newline at end of file
+.. |@cached_property| replace:: :func:`~traits.has_traits.cached_property`
diff --git a/docs/source/traits_user_manual/custom.rst b/docs/source/traits_user_manual/custom.rst
index 0032b7a..7364d11 100644
--- a/docs/source/traits_user_manual/custom.rst
+++ b/docs/source/traits_user_manual/custom.rst
@@ -219,6 +219,12 @@ API Reference* sections on the TraitType and BaseTraitHandler classes.
 The Trait() Factory Function
 ----------------------------
 
+.. note::
+
+   The :func:`~.Trait` function is not recommended for use in new code, and may
+   eventually be deprecated and removed. Consider using :class:`~.Union`
+   instead.
+
 The Trait() function is a generic factory for trait definitions. It has many
 forms, many of which are redundant with the predefined shortcut traits. For
 example, the simplest form Trait(default_value), is equivalent to the functions
@@ -462,6 +468,10 @@ the traits.trait_handlers module.
 TraitPrefixList
 ```````````````
 
+.. deprecated:: 6.1
+    :class:`~.TraitPrefixList` is scheduled for removal
+    in Traits 7.0. Use the :class:`~.PrefixList` trait type instead.
+
 The TraitPrefixList handler accepts not only a specified set of strings as
 values, but also any unique prefix substring of those values. The value assigned
 to the trait attribute is the full string that the substring matches.
@@ -501,6 +511,10 @@ For example::
 TraitPrefixMap
 ``````````````
 
+.. deprecated:: 6.1
+    :class:`~.TraitPrefixMap` is scheduled for removal
+    in Traits 7.0. Use the :class:`~.PrefixMap` trait type instead.
+
 The TraitPrefixMap handler combines the TraitPrefixList with mapped traits. Its
 constructor takes a parameter that is a dictionary whose keys are strings. A
 string is a valid value if it is a unique prefix for a key in the dictionary.
diff --git a/docs/source/traits_user_manual/debugging.rst b/docs/source/traits_user_manual/debugging.rst
index a120191..3f68190 100644
--- a/docs/source/traits_user_manual/debugging.rst
+++ b/docs/source/traits_user_manual/debugging.rst
@@ -33,7 +33,7 @@ logged::
    Exception occurred in traits notification handler.
    Please check the log file for details.
    Exception occurred in traits notification handler for object:
-   <__main__.Curmudgeon object at 0x107603050>, trait: constant, old value: 0, new value: 42 
+   <__main__.Curmudgeon object at 0x107603050>, trait: constant, old value: 0, new value: 42
      ...
      File "curmudgeon.py", line 12, in _constant_changed
        raise ValueError()
@@ -71,7 +71,7 @@ Tracing Traits Change Events
 
 Occasionally it is necessary to find the chain of event dispatches in traits
 classes. To help with debugging, a |record_events| context manager is provided
-in mod:`traits.util.event_tracer`. Trait change events taking place inside the
+in :mod:`traits.util.event_tracer`. Trait change events taking place inside the
 context block will be recorded in a change event container (see example below)
 and can be saved to files (a file for each thread) for further inspection.
 
diff --git a/docs/source/traits_user_manual/defining.rst b/docs/source/traits_user_manual/defining.rst
index eb4aee4..d4afaa0 100644
--- a/docs/source/traits_user_manual/defining.rst
+++ b/docs/source/traits_user_manual/defining.rst
@@ -130,7 +130,7 @@ pass it as an argument to the trait::
 
     account_balance = Float(10.0)
 
-Most predefined traits are callable, [2]_ and can accept a default value and
+Most predefined traits are callable [1]_, and can accept a default value and
 possibly other arguments; all that are callable can also accept metadata as
 keyword arguments. (See :ref:`other-predefined-traits` for information on trait
 signatures, and see :ref:`trait-metadata` for information on metadata
@@ -261,15 +261,15 @@ trait cannot be used as a simple name, it is omitted from the Name column of
 the table.
 
 .. index:: Any(), Array(), Button(), Callable(), CArray(), Code()
-.. index:: CSet(), Constant(), Dict()
+.. index:: CSet(), Constant(), Date(), Datetime(), Dict()
 .. index:: Directory(), Disallow, Either(), Enum()
 .. index:: Event(), Expression(), false, File()
 .. index:: Instance(), List(), Method(), Module()
 .. index:: Password(), Property(), Python()
 .. index:: PythonValue(), Range(), ReadOnly(), Regex()
-.. index:: Set() String(), This,
+.. index:: Set() String(), This, Time()
 .. index:: ToolbarButton(), true, Tuple(), Type()
-.. index:: undefined, UUID(), ValidatedTuple(), WeakRef()
+.. index:: undefined, Union(), UUID(), ValidatedTuple(), WeakRef()
 
 .. _predefined-traits-beyond-simple-types-table:
 
@@ -280,7 +280,7 @@ the table.
 +==================+==========================================================+
 | Any              | Any( [*default_value* = None, \*,                        |
 |                  | *factory* = None, *args* = (), *kw* = {},                |
-|                  | \*\*\ *metadata* )                                       |
+|                  | \*\*\ *metadata*] )                                      |
 +------------------+----------------------------------------------------------+
 | Array            | Array( [*dtype* = None, *shape* = None, *value* = None,  |
 |                  | *typecode* = None, \*\*\ *metadata*] )                   |
@@ -306,6 +306,13 @@ the table.
 +------------------+----------------------------------------------------------+
 | Constant         | Constant( *value*\ [, \*\*\ *metadata*] )                |
 +------------------+----------------------------------------------------------+
+| Date             | Date( *value*\ [, *default_value* = None,                |
+|                  | *allow_datetime* = None, *allow_none* = None,            |
+|                  | \*\*\ *metadata*] )                                      |
++------------------+----------------------------------------------------------+
+| Datetime         | Datetime( *value*\ [, *default_value* = None,            |
+|                  | *allow_none* = None, \*\*\ *metadata*])                  |
++------------------+----------------------------------------------------------+
 | Dict             | Dict( [*key_trait* = None, *value_trait* = None,         |
 |                  | *value* = None, *items* = True, \*\*\ *metadata*] )      |
 +------------------+----------------------------------------------------------+
@@ -314,7 +321,7 @@ the table.
 +------------------+----------------------------------------------------------+
 | Disallow         | n/a                                                      |
 +------------------+----------------------------------------------------------+
-| Either           | Either( *val1*\ [, *val2*, ..., *valN*,                  |
+| Either [2]_      | Either( *val1*\ [, *val2*, ..., *valN*,                  |
 |                  | \*\*\ *metadata*] )                                      |
 +------------------+----------------------------------------------------------+
 | Enum             | Enum( *values*\ [, \*\*\ *metadata*] )                   |
@@ -386,6 +393,9 @@ the table.
 +------------------+----------------------------------------------------------+
 | This             | n/a                                                      |
 +------------------+----------------------------------------------------------+
+| Time             | Time( *value*\ [, *default_value* = None,                |
+|                  | *allow_none* = None, \*\*\ *metadata*])                  |
++------------------+----------------------------------------------------------+
 | ToolbarButton    | ToolbarButton( [*label* = '', *image* = None, *style* =  |
 |                  | 'toolbar', *orientation* = 'vertical', *width_padding* = |
 |                  | 2, *height_padding* = 2, \*\*\ *metadata*] )             |
@@ -398,7 +408,7 @@ the table.
 | Union            | Union( *val1*\ [, *val2*, ..., *valN*,                   |
 |                  | \*\*\ *metadata*] )                                      |
 +------------------+----------------------------------------------------------+
-| UUID [4]_        | UUID( [\*\*\ *metadata*] )                               |
+| UUID             | UUID( [\*\*\ *metadata*] )                               |
 +------------------+----------------------------------------------------------+
 | ValidatedTuple   | ValidatedTuple( [\*\ *traits*, *fvalidate* = None,       |
 |                  | *fvalidate_info* = '' , \*\*\ *metadata*] )              |
@@ -628,56 +638,12 @@ prefix. Instantiating the class produces the following::
     >>> print(bob.married)
     no
 
-.. index:: Either trait
-
-.. _either:
-
-Either
-::::::
-Another predefined trait that merits special explanation is Either. The
-Either trait is intended for attributes that may take a value of more than
-a single trait type, including None. The default value of Either is None, even
-if None is not one of the types the user explicitly defines in the constructor,
-but a different default value can be provided using the ``default`` argument.
-
-.. index::
-   pair: Either trait; examples
-
-The following is an example of using Either::
-
-    # either.py --- Example of Either predefined trait
-
-    from traits.api import HasTraits, Either, Str
-
-    class Employee(HasTraits):
-        manager_name = Either(Str, None)
-
-This example defines an Employee class, which has a **manager_name** trait
-attribute, which accepts either an Str instance or None as its value, and
-will raise a TraitError if a value of any other type is assigned. For example::
-
-    >>> from traits.api import HasTraits, Either, Str
-    >>> class Employee(HasTraits):
-    ...     manager_name = Either(Str, None)
-    ...
-    >>> steven = Employee(manager_name="Jenni")
-    >>> # Here steven's manager is named "Jenni"
-    >>> steven.manager_name
-    'Jenni'
-    >>> eric = Employee(manager_name=None)
-    >>> # Eric is the boss, so he has no manager.
-    >>> eric.manager_name is None
-    True
-    >>> # Assigning a value that is neither a string nor None will fail.
-    >>> steven.manager_name = 5
-    traits.trait_errors.TraitError: The 'manager_name' trait of an Employee instance must be a string or None, but a value of 5 <type 'int'> was specified.
-
 .. index:: Union trait
 
 .. _union:
 
 Union
-::::::
+:::::
 The Union trait accepts a value that is considered valid by at least one
 of the traits in its definition. It is a simpler and therefore less error-prone
 alternative to the `Either` trait, which allows more complex constructs and
@@ -709,7 +675,7 @@ attribute, which accepts either an Str instance or None as its value, a
 **salary** trait that accepts an instance of Salary or Float and will raise a
 TraitError if a value of any other type is assigned. For example::
 
-    >>> from traits.api import HasTraits, Either, Str
+    >>> from traits.api import HasTraits, Str, Union
     >>> class Employee(HasTraits):
     ...     manager_name = Union(Str, None)
     ...
@@ -721,7 +687,7 @@ TraitError if a value of any other type is assigned. For example::
 
 The following example illustrates the difference between `Either` and `Union`::
 
-    >>> from traits.api import HasTraits, Either, Union, Str
+    >>> from traits.api import Either, HasTraits, Str, Union
     >>> class IntegerClass(HasTraits):
     ...     primes = Either([2], None, {'3':6}, 5, 7, 11)
     ...
@@ -734,6 +700,56 @@ The following example illustrates the difference between `Either` and `Union`::
     ...     primes = Union([2], None, {'3':6}, 5, 7, 11)
     ValueError: Union trait declaration expects a trait type or an instance of trait type or None, but got [2] instead
 
+.. index:: Either trait
+
+.. _either:
+
+Either
+::::::
+
+.. note::
+   The :class:`~.Either` trait type may eventually be deprecated, and should
+   not be used in new code. Use the more well-behaved :class:`~.Union` trait
+   type instead.
+
+Another predefined trait that merits special explanation is Either. The
+Either trait is intended for attributes that may take a value of more than
+a single trait type, including None. The default value of Either is None, even
+if None is not one of the types the user explicitly defines in the constructor,
+but a different default value can be provided using the ``default`` argument.
+
+.. index::
+   pair: Either trait; examples
+
+The following is an example of using Either::
+
+    # either.py --- Example of Either predefined trait
+
+    from traits.api import HasTraits, Either, Str
+
+    class Employee(HasTraits):
+        manager_name = Either(Str, None)
+
+This example defines an Employee class, which has a **manager_name** trait
+attribute, which accepts either an Str instance or None as its value, and
+will raise a TraitError if a value of any other type is assigned. For example::
+
+    >>> from traits.api import HasTraits, Either, Str
+    >>> class Employee(HasTraits):
+    ...     manager_name = Either(Str, None)
+    ...
+    >>> steven = Employee(manager_name="Jenni")
+    >>> # Here steven's manager is named "Jenni"
+    >>> steven.manager_name
+    'Jenni'
+    >>> eric = Employee(manager_name=None)
+    >>> # Eric is the boss, so he has no manager.
+    >>> eric.manager_name is None
+    True
+    >>> # Assigning a value that is neither a string nor None will fail.
+    >>> steven.manager_name = 5
+    traits.trait_errors.TraitError: The 'manager_name' trait of an Employee instance must be a string or None, but a value of 5 <type 'int'> was specified.
+
 
 .. _migration_either_to_union:
 
@@ -1031,14 +1047,16 @@ the metadata attribute::
     print(t.trait( 'any' ).is_trait_type( Str ))       # False
 
 .. rubric:: Footnotes
-.. [2] Most callable predefined traits are classes, but a few are functions.
+.. [1] Most callable predefined traits are classes, but a few are functions.
        The distinction does not make a difference unless you are trying to
        extend an existing predefined trait. See the *Traits API Reference* for
        details on particular traits, and see Chapter 5 for details on extending
        existing traits.
+.. [2] The :class:`~.Either` trait type is likely to be deprecated at some
+       point in the future. The :class:`~.Union` trait type should be preferred
+       to :class:`~.Either` in new code.
 .. [3] The Function and Method trait types are now deprecated. See |Function|,
        |Method|
-.. [4] Available in Python 2.5.
 
 ..
    external urls
diff --git a/docs/source/traits_user_manual/index.rst b/docs/source/traits_user_manual/index.rst
index 81e2042..7eea6ac 100644
--- a/docs/source/traits_user_manual/index.rst
+++ b/docs/source/traits_user_manual/index.rst
@@ -3,7 +3,7 @@ Traits |version| User Manual
 ============================
 
 :Authors: David C. Morrill, Janet M. Swisher, and Enthought developers
-:Copyright: | (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+:Copyright: | (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
             | All rights reserved.
 
 Contents
diff --git a/docs/source/traits_user_manual/listening.rst b/docs/source/traits_user_manual/listening.rst
index 6ae7fc6..adb9208 100644
--- a/docs/source/traits_user_manual/listening.rst
+++ b/docs/source/traits_user_manual/listening.rst
@@ -155,24 +155,25 @@ Semantics
 +------------------------------+----------------------------------------------+
 | Pattern                      | Meaning                                      |
 +==============================+==============================================+
-|*item1*\ .\ *item2*           |A trait named item1 contains an object (or    |
-|                              |objects, if *item1* is a list or dictionary), |
-|                              |with a trait named *item2*. Changes to either |
-|                              |*item1* or *item2* trigger a  notification.   |
+|*item1*\ .\ *item2*           |A trait named *item1* contains an object (or  |
+|                              |objects, if *item1* is a list, dictionary or  |
+|                              |set), with a trait named *item2*. Changes to  |
+|                              |either *item1* or *item2* trigger a           |
+|                              |notification.                                 |
 +------------------------------+----------------------------------------------+
-|*item1*\ :*item2*             |A trait named **item1** contains an object (or|
-|                              |objects, if *item1* is a list or dictionary), |
-|                              |with a trait named *item2*. Changes to *item2*|
-|                              |trigger a notification, while changes to      |
-|                              |*item1* do not (i.e., the ':' indicates that  |
-|                              |changes to the link object are not reported.  |
+|*item1*\ :*item2*             |A trait named *item1* contains an object (or  |
+|                              |objects, if *item1* is a list, dictionary or  |
+|                              |set), with a trait named *item2*. Changes to  |
+|                              |*item2* trigger a notification, while changes |
+|                              |to *item1* do not (the ':' indicates that     |
+|                              |changes to the link object are not reported). |
 +------------------------------+----------------------------------------------+
 |[*item1*, *item2*, ...,       |A list that matches any of the specified      |
 |*itemN*]                      |items. Note that at the topmost level, the    |
 |                              |surrounding square brackets are optional.     |
 +------------------------------+----------------------------------------------+
-|*item*\ []                    |A trait named *item* is a list. Changes to    |
-|                              |*item* or to its members triggers a           |
+|*item*\ []                    |A trait named *item* is a list or set. Changes|
+|                              |to *item* or to its members trigger a         |
 |                              |notification.                                 |
 +------------------------------+----------------------------------------------+
 |*name*?                       |If the current object does not have an        |
@@ -199,7 +200,11 @@ Semantics
 |                              |begins with *prefix* and that does *not* have |
 |                              |a metadata attribute called *metadata_name*.  |
 +------------------------------+----------------------------------------------+
-|``+``                         |Matches all traits on the object.             |
+|``+``                         |Matches all traits on the object, via         |
+|                              |per-trait notifiers. (See note below.)        |
++------------------------------+----------------------------------------------+
+|``-``                         |Matches all traits on the object, via an      |
+|                              |object notifier. (See note below.)            |
 +------------------------------+----------------------------------------------+
 |*pattern*\ *                  |Matches object graphs where *pattern* occurs  |
 |                              |one or more times. This option is useful for  |
@@ -207,6 +212,15 @@ Semantics
 |                              |structures like trees or linked lists.        |
 +------------------------------+----------------------------------------------+
 
+.. note::
+    The patterns ``"+"`` and ``"-"`` both match all traits on a ``HasTraits``
+    object. The two patterns behave almost identically, but
+    there's a difference at the implementation level. The ``"+"`` pattern
+    registers one trait-level notifier for each trait on the target object,
+    while the ``"-"`` pattern registers a single *object*-level notifier on the
+    target object. As a result, the two patterns may have different
+    performance characteristics.
+
 .. index:: extended trait names; examples
 
 .. _examples-of-extended-name-notation-table:
@@ -228,7 +242,8 @@ Semantics
 |``'foo.[bar,baz]'``       |Matches *object*.\ **foo.bar** and                |
 |                          |*object*.\ **foo.baz**                            |
 +--------------------------+--------------------------------------------------+
-|``'foo[]'``               |Matches a list trait on *object* named **foo**.   |
+|``'foo[]'``               |Matches a list or set trait on *object* named     |
+|                          |**foo**.                                          |
 +--------------------------+--------------------------------------------------+
 |``'([left,right]).name*'``|Matches the **name** trait of each tree node      |
 |                          |object that is linked from the **left** or        |
@@ -250,21 +265,22 @@ Semantics
 +--------------------------+--------------------------------------------------+
 
 For a pattern that references multiple objects, any of the intermediate
-(non-final) links can be traits of type Instance, List, or Dict. In the case of
-List or Dict traits, the subsequent portion of the pattern is applied to each
-item in the list or value in the dictionary. For example, if **self.children**
-is a list, a handler set for ``'children.name'`` listens for changes to the
-**name** trait for each item in the **self.children** list.
+(non-final) links can be traits of type Instance, List, Dict or Set. In the
+case of List, Dict and Set traits, the subsequent portion of the pattern is
+applied to each item in the list or set, or to each value in the dictionary.
+For example, if **self.children** is a list, a handler set for
+``'children.name'`` listens for changes to the **name** trait for each item in
+the **self.children** list.
 
 .. note::
-    In the case of Dict, List, and Set with nested patterns (e.g.,
+    In the case of List, Dict and Set with nested patterns (e.g.,
     ``'children.name'``), not all handler signatures (see
     :ref:`notification-handler-signatures`) are supported; see section
     :ref:`dynamic-handler-special-cases` for more details.
 
-The handler routine is also invoked when items are added or removed from a list
-or dictionary, because this is treated as an implied change to the item's trait
-being monitored.
+The handler routine is also invoked when items are added or removed from a
+list, dictionary or set, because this is treated as an implied change to the
+item's trait being monitored.
 
 .. index:: notification; dynamic
 
@@ -293,20 +309,22 @@ These signatures use the following parameters:
 .. index:: name parameter; notification handlers
 
 * *name*: The attribute that changed. If one of the objects in a sequence is a
-  List or Dict, and its membership changes, then this is the name of the trait
-  that references it, with '_items appended. For example, if the handler is
-  monitoring ``'foo.bar.baz'``, where **bar** is a List, and an item is added
-  to **bar**, then the value of the *name* parameter is 'bar_items'.
+  List, Dict or Set, and its membership changes, then this is the name of the
+  trait that references it, with '_items appended. For example, if the handler
+  is monitoring ``'foo.bar.baz'``, where **bar** is a List, and an item is
+  added to **bar**, then the value of the *name* parameter is 'bar_items'.
 
 .. index:: new parameter to the notification handlers
 
 * *new*: The new value of the trait attribute that changed. For changes to
-  List and Dict objects, this is a list of items that were added.
+  List objects, this is a list of items that were added. For changes
+  to Set objects, this is a set of items that were added.
 
 .. index:: old parameter to the notification handlers
 
 * *old*: The old value of the trait attribute that changed. For changes to List
-  and Dict object, this is a list of items that were deleted. For event traits,
+  objects, this is a list of items that were deleted. For changes to
+  Set objects, this is a set of items that were deleted. For event traits,
   this is Undefined.
 
 If the handler is a bound method, it also implicitly has *self* as a first
@@ -325,20 +343,21 @@ monitored, and a change to an intermediate object. In this case, the
 notification dispatcher attempts to map a change to an intermediate object to
 its effective change on the final trait attribute. This mapping is only
 possible if all the intermediate objects are single values (such as Instance or
-Any traits), and not List or Dict traits. If the change involves a List or
-Dict, then the notification dispatcher raises a TraitError when attempting to
-call a one- or two-parameter handler function, because it cannot unambiguously
-resolve the effective value for the final trait attribute.
+Any traits), and not List, Dict or Set traits. If the change involves a List,
+Dict or Set, then the notification dispatcher raises a TraitError when
+attempting to call a one- or two-parameter handler function, because it cannot
+unambiguously resolve the effective value for the final trait attribute.
 
 Zero-parameter signature handlers receive special treatment if the final trait
-attribute is a List or Dict, and if the string used for the *name* parameter is
-not just a simple trait name. In this case, the handler is automatically called
-when the membership of a final List or Dict trait is changed. This behavior can
-be useful in cases where the handler needs to know only that some aspect of the
-final trait has changed. For all other signatures, the handler function must be
-explicitly set for the *name*\ _items trait in order to called when the
-membership of the name trait changes. (Note that the *prefix*\ + and *item*\ []
-syntaxes are both ways to specify both a trait name and its '_items' variant.)
+attribute is a List, Dict or Set, and if the string used for the *name*
+parameter is not just a simple trait name. In this case, the handler is
+automatically called when the membership of a final List, Dict or Set trait is
+changed. This behavior can be useful in cases where the handler needs to know
+only that some aspect of the final trait has changed. For all other signatures,
+the handler function must be explicitly set for the *name*\ _items trait in
+order to called when the membership of the name trait changes. (Note that the
+*prefix*\ + and *item*\ [] syntaxes are both ways to specify both a trait name
+and its '_items' variant.)
 
 This behavior for zero-parameter handlers is not triggered for simple trait
 names, to preserve compatibility with code written for versions of Traits
@@ -670,10 +689,10 @@ As an example of an event, consider::
             self.redraw()
 
 In support of the use of events, the Traits package understands
-attribute-specific notification handlers with names of the form
-_\ *name*\ _fired(), with signatures identical to the _\ *name*\ _changed() functions.
-In fact, the Traits package does not check whether the trait attributes that
-_\ *name*\ _fired() handlers are applied to are actually events. The function
+attribute-specific notification handlers with names of the form _\ *name*\
+_fired(), with signatures identical to the _\ *name*\ _changed() functions. In
+fact, the Traits package does not check whether the trait attributes that _\
+*name*\ _fired() handlers are applied to are actually events. The function
 names are simply synonyms for programmer convenience.
 
 Similarly, a function named on_trait_event() can be used as a synonym for
@@ -717,18 +736,18 @@ handler with the ``[]`` suffix as noted in the Table
 For these trait types, an auxiliary *name*\ _items Event trait is defined which
 you can listen to either with a static handler _\ *name*\ _items_changed()
 or a dynamic handler which matches *name*\ _items, and these handlers will be
-called with notifications of changes to the contents of the list, set or
-dictionary.
+called with notifications of changes to the contents of the list, dictionary
+or set.
 
-.. index:: TraitListEvent, TraitSetEvent, TraitDictEvent
+.. index:: TraitListEvent, TraitDictEvent, TraitSetEvent
 
 For these handlers the *new* parameter is a :index:`TraitListEvent`,
-:index:`TraitSetEvent` or :index:`TraitDictEvent` object whose attributes
+:index:`TraitDictEvent` or :index:`TraitSetEvent` object whose attributes
 indicate the nature of the change and, because they are Event handlers, the
 *old* parameter is Undefined.
 
 All of these event objects have **added** and **removed** attributes that
-hold a list, set or dictionary of the items that were added and removed,
+hold a list, dictionary or set of the items that were added and removed,
 respectively.
 
 The TraitListEvent has an additional **index** attribute that holds either
@@ -799,5 +818,5 @@ supports length checking::
     name = String(minlen=1)
 
 Traits consider handlers for the same change event to be independent of each
-other. Therefore, any uncaught exception from one change handler will be captured
-and logged, so not to prevent other handlers to be called.
+other. Therefore, any uncaught exception from one change handler will be
+captured and logged, so not to prevent other handlers to be called.
diff --git a/etstool.py b/etstool.py
index 945ba42..5cd34a5 100644
--- a/etstool.py
+++ b/etstool.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -61,10 +61,8 @@ a developer's purpose.
 Changing This File
 ------------------
 
-To change the packages installed during a test run, change the dependencies
-variable below.  To install a package from github, or one which is not yet
-available via EDM, add it to the `ci-src-requirements.txt` file (these will be
-installed by `pip`).
+To change the packages installed during a test run, change the
+``common_dependencies`` variable below.
 
 Other changes to commands should be a straightforward change to the listed
 commands for each task. See the EDM documentation for more information about
@@ -95,14 +93,23 @@ common_dependencies = {
     "enthought_sphinx_theme",
     "flake8",
     "flake8_ets",
-    "lark_parser",
-    "mypy",
     "numpy",
-    "pyqt5",
     "Sphinx",
+    "sphinx_copybutton",
     "traitsui",
 }
 
+# Dependencies on the Python runtime.
+runtime_dependencies = {
+    "3.6": {"pyqt5", "lark_parser", "mypy"},
+    "3.8": {"pyside6"},
+}
+
+# Dependencies that need to be installed from PyPI
+pypi_dependencies = {
+    "3.8": {"lark-parser", "mypy"}
+}
+
 # Dependencies we install from source for testing
 source_dependencies = {"traitsui"}
 
@@ -111,8 +118,8 @@ unix_dependencies = {
     "gnureadline",
 }
 
-supported_runtimes = ["3.6"]
-default_runtime = "3.6"
+supported_runtimes = ["3.6", "3.8"]
+default_runtime = "3.8"
 
 github_url_fmt = "git+http://github.com/enthought/{0}.git#egg={0}"
 
@@ -171,6 +178,7 @@ def install(edm, runtime, environment, editable, source):
     """
     parameters = get_parameters(edm, runtime, environment)
     dependencies = common_dependencies.copy()
+    dependencies.update(runtime_dependencies.get(runtime, set()))
     if sys.platform != "win32":
         dependencies.update(unix_dependencies)
 
@@ -191,6 +199,12 @@ def install(edm, runtime, environment, editable, source):
         install_stubs,
     ]
 
+    if pypi_dependencies:
+        commands += [
+            "{edm} run -e {environment} -- python -m pip install " + dep
+            for dep in pypi_dependencies.get(runtime, set())
+        ]
+
     click.echo("Creating environment '{environment}'".format(**parameters))
     execute(commands, parameters)
     if source:
diff --git a/examples/tutorials/doc_examples/__init__.py b/examples/tutorials/doc_examples/__init__.py
index 6855f7b..c40e324 100644
--- a/examples/tutorials/doc_examples/__init__.py
+++ b/examples/tutorials/doc_examples/__init__.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/__init__.py b/examples/tutorials/doc_examples/examples/__init__.py
index 11f7487..d49e25c 100644
--- a/examples/tutorials/doc_examples/examples/__init__.py
+++ b/examples/tutorials/doc_examples/examples/__init__.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/adapt_metadata.py b/examples/tutorials/doc_examples/examples/adapt_metadata.py
index d2a2b30..49b83d8 100644
--- a/examples/tutorials/doc_examples/examples/adapt_metadata.py
+++ b/examples/tutorials/doc_examples/examples/adapt_metadata.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/add_class_trait.py b/examples/tutorials/doc_examples/examples/add_class_trait.py
index 882b8ae..7dd6987 100644
--- a/examples/tutorials/doc_examples/examples/add_class_trait.py
+++ b/examples/tutorials/doc_examples/examples/add_class_trait.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/all_traits_features.py b/examples/tutorials/doc_examples/examples/all_traits_features.py
index 041eafb..534f89b 100644
--- a/examples/tutorials/doc_examples/examples/all_traits_features.py
+++ b/examples/tutorials/doc_examples/examples/all_traits_features.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/all_wildcard.py b/examples/tutorials/doc_examples/examples/all_wildcard.py
index 1ab4435..52ae37f 100644
--- a/examples/tutorials/doc_examples/examples/all_wildcard.py
+++ b/examples/tutorials/doc_examples/examples/all_wildcard.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/bad_self_ref.py b/examples/tutorials/doc_examples/examples/bad_self_ref.py
index 0730a70..e665995 100644
--- a/examples/tutorials/doc_examples/examples/bad_self_ref.py
+++ b/examples/tutorials/doc_examples/examples/bad_self_ref.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/cached_prop.py b/examples/tutorials/doc_examples/examples/cached_prop.py
index 753d2ec..a4583a2 100644
--- a/examples/tutorials/doc_examples/examples/cached_prop.py
+++ b/examples/tutorials/doc_examples/examples/cached_prop.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/circular_definition.py b/examples/tutorials/doc_examples/examples/circular_definition.py
index a124990..d0c5a1a 100644
--- a/examples/tutorials/doc_examples/examples/circular_definition.py
+++ b/examples/tutorials/doc_examples/examples/circular_definition.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/compound.py b/examples/tutorials/doc_examples/examples/compound.py
index 87b3059..1fb7070 100644
--- a/examples/tutorials/doc_examples/examples/compound.py
+++ b/examples/tutorials/doc_examples/examples/compound.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/configure_traits.py b/examples/tutorials/doc_examples/examples/configure_traits.py
index 82a2718..22d8d41 100644
--- a/examples/tutorials/doc_examples/examples/configure_traits.py
+++ b/examples/tutorials/doc_examples/examples/configure_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/custom_traithandler.py b/examples/tutorials/doc_examples/examples/custom_traithandler.py
index 7a5e00e..72ba2e6 100644
--- a/examples/tutorials/doc_examples/examples/custom_traithandler.py
+++ b/examples/tutorials/doc_examples/examples/custom_traithandler.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/deferring_notification.py b/examples/tutorials/doc_examples/examples/deferring_notification.py
index 78664fd..d3403e3 100644
--- a/examples/tutorials/doc_examples/examples/deferring_notification.py
+++ b/examples/tutorials/doc_examples/examples/deferring_notification.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/delegate.py b/examples/tutorials/doc_examples/examples/delegate.py
index f0fd230..5919cbc 100644
--- a/examples/tutorials/doc_examples/examples/delegate.py
+++ b/examples/tutorials/doc_examples/examples/delegate.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/disallow.py b/examples/tutorials/doc_examples/examples/disallow.py
index 0498648..5a84c1c 100644
--- a/examples/tutorials/doc_examples/examples/disallow.py
+++ b/examples/tutorials/doc_examples/examples/disallow.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/dynamic_notification.py b/examples/tutorials/doc_examples/examples/dynamic_notification.py
index 30e6d34..60aeb65 100644
--- a/examples/tutorials/doc_examples/examples/dynamic_notification.py
+++ b/examples/tutorials/doc_examples/examples/dynamic_notification.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/event.py b/examples/tutorials/doc_examples/examples/event.py
index 4d6bc77..70eeea2 100644
--- a/examples/tutorials/doc_examples/examples/event.py
+++ b/examples/tutorials/doc_examples/examples/event.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/instance_trait_defaults.py b/examples/tutorials/doc_examples/examples/instance_trait_defaults.py
index 8fbcd94..b27ba00 100644
--- a/examples/tutorials/doc_examples/examples/instance_trait_defaults.py
+++ b/examples/tutorials/doc_examples/examples/instance_trait_defaults.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/interface_definition.py b/examples/tutorials/doc_examples/examples/interface_definition.py
index 00dd023..ef9c639 100644
--- a/examples/tutorials/doc_examples/examples/interface_definition.py
+++ b/examples/tutorials/doc_examples/examples/interface_definition.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/interface_implementation.py b/examples/tutorials/doc_examples/examples/interface_implementation.py
index 0922134..a0f911c 100644
--- a/examples/tutorials/doc_examples/examples/interface_implementation.py
+++ b/examples/tutorials/doc_examples/examples/interface_implementation.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/keywords.py b/examples/tutorials/doc_examples/examples/keywords.py
index 8e44f12..b924ff1 100644
--- a/examples/tutorials/doc_examples/examples/keywords.py
+++ b/examples/tutorials/doc_examples/examples/keywords.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/list_notifier.py b/examples/tutorials/doc_examples/examples/list_notifier.py
index d362c20..35c0a78 100644
--- a/examples/tutorials/doc_examples/examples/list_notifier.py
+++ b/examples/tutorials/doc_examples/examples/list_notifier.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/mapped.py b/examples/tutorials/doc_examples/examples/mapped.py
index 81fe788..48ea044 100644
--- a/examples/tutorials/doc_examples/examples/mapped.py
+++ b/examples/tutorials/doc_examples/examples/mapped.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/metadata.py b/examples/tutorials/doc_examples/examples/metadata.py
index 3fdc92c..c19cbae 100644
--- a/examples/tutorials/doc_examples/examples/metadata.py
+++ b/examples/tutorials/doc_examples/examples/metadata.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/minimal.py b/examples/tutorials/doc_examples/examples/minimal.py
index f81d1dc..e3df632 100644
--- a/examples/tutorials/doc_examples/examples/minimal.py
+++ b/examples/tutorials/doc_examples/examples/minimal.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/object_trait_attrs.py b/examples/tutorials/doc_examples/examples/object_trait_attrs.py
index ed75b95..3078ddf 100644
--- a/examples/tutorials/doc_examples/examples/object_trait_attrs.py
+++ b/examples/tutorials/doc_examples/examples/object_trait_attrs.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/observe_decorator.py b/examples/tutorials/doc_examples/examples/observe_decorator.py
index 67bb800..410b976 100644
--- a/examples/tutorials/doc_examples/examples/observe_decorator.py
+++ b/examples/tutorials/doc_examples/examples/observe_decorator.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/observe_different_events.py b/examples/tutorials/doc_examples/examples/observe_different_events.py
index 106ce71..7081710 100644
--- a/examples/tutorials/doc_examples/examples/observe_different_events.py
+++ b/examples/tutorials/doc_examples/examples/observe_different_events.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/observe_method.py b/examples/tutorials/doc_examples/examples/observe_method.py
index 634f531..3175b22 100644
--- a/examples/tutorials/doc_examples/examples/observe_method.py
+++ b/examples/tutorials/doc_examples/examples/observe_method.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/observe_optional.py b/examples/tutorials/doc_examples/examples/observe_optional.py
index dae0c53..d44573c 100644
--- a/examples/tutorials/doc_examples/examples/observe_optional.py
+++ b/examples/tutorials/doc_examples/examples/observe_optional.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/observe_post_init.py b/examples/tutorials/doc_examples/examples/observe_post_init.py
index f106222..d6e3fd6 100644
--- a/examples/tutorials/doc_examples/examples/observe_post_init.py
+++ b/examples/tutorials/doc_examples/examples/observe_post_init.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/override_default.py b/examples/tutorials/doc_examples/examples/override_default.py
index 2e4794a..b2215bb 100644
--- a/examples/tutorials/doc_examples/examples/override_default.py
+++ b/examples/tutorials/doc_examples/examples/override_default.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/post_init_notification.py b/examples/tutorials/doc_examples/examples/post_init_notification.py
index 1a633ff..1cf22b6 100644
--- a/examples/tutorials/doc_examples/examples/post_init_notification.py
+++ b/examples/tutorials/doc_examples/examples/post_init_notification.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/prototype_prefix.py b/examples/tutorials/doc_examples/examples/prototype_prefix.py
index 48a5d7e..628bacf 100644
--- a/examples/tutorials/doc_examples/examples/prototype_prefix.py
+++ b/examples/tutorials/doc_examples/examples/prototype_prefix.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/simple_adapter.py b/examples/tutorials/doc_examples/examples/simple_adapter.py
index 84e579b..0c977ed 100644
--- a/examples/tutorials/doc_examples/examples/simple_adapter.py
+++ b/examples/tutorials/doc_examples/examples/simple_adapter.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/static_notification.py b/examples/tutorials/doc_examples/examples/static_notification.py
index d13bb3b..f92d099 100644
--- a/examples/tutorials/doc_examples/examples/static_notification.py
+++ b/examples/tutorials/doc_examples/examples/static_notification.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/temp_wildcard.py b/examples/tutorials/doc_examples/examples/temp_wildcard.py
index 1bb5530..f5bb0c0 100644
--- a/examples/tutorials/doc_examples/examples/temp_wildcard.py
+++ b/examples/tutorials/doc_examples/examples/temp_wildcard.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/this.py b/examples/tutorials/doc_examples/examples/this.py
index 19ae57d..90505f1 100644
--- a/examples/tutorials/doc_examples/examples/this.py
+++ b/examples/tutorials/doc_examples/examples/this.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/trait_reuse.py b/examples/tutorials/doc_examples/examples/trait_reuse.py
index c52be8e..25b92dd 100644
--- a/examples/tutorials/doc_examples/examples/trait_reuse.py
+++ b/examples/tutorials/doc_examples/examples/trait_reuse.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/trait_subclass.py b/examples/tutorials/doc_examples/examples/trait_subclass.py
index e59f59f..8938ee3 100644
--- a/examples/tutorials/doc_examples/examples/trait_subclass.py
+++ b/examples/tutorials/doc_examples/examples/trait_subclass.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/traitprefixmap.py b/examples/tutorials/doc_examples/examples/traitprefixmap.py
index 3762124..95d3f58 100644
--- a/examples/tutorials/doc_examples/examples/traitprefixmap.py
+++ b/examples/tutorials/doc_examples/examples/traitprefixmap.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/transient_metadata.py b/examples/tutorials/doc_examples/examples/transient_metadata.py
index 7bd00c5..f02e326 100644
--- a/examples/tutorials/doc_examples/examples/transient_metadata.py
+++ b/examples/tutorials/doc_examples/examples/transient_metadata.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/use_custom_th.py b/examples/tutorials/doc_examples/examples/use_custom_th.py
index 4814bc8..4a0f098 100644
--- a/examples/tutorials/doc_examples/examples/use_custom_th.py
+++ b/examples/tutorials/doc_examples/examples/use_custom_th.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/widget.py b/examples/tutorials/doc_examples/examples/widget.py
index 75fb9e1..f61e060 100644
--- a/examples/tutorials/doc_examples/examples/widget.py
+++ b/examples/tutorials/doc_examples/examples/widget.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/wildcard.py b/examples/tutorials/doc_examples/examples/wildcard.py
index c6de75b..ea6cda7 100644
--- a/examples/tutorials/doc_examples/examples/wildcard.py
+++ b/examples/tutorials/doc_examples/examples/wildcard.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/wildcard_all.py b/examples/tutorials/doc_examples/examples/wildcard_all.py
index 3323c90..f341c43 100644
--- a/examples/tutorials/doc_examples/examples/wildcard_all.py
+++ b/examples/tutorials/doc_examples/examples/wildcard_all.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/wildcard_name.py b/examples/tutorials/doc_examples/examples/wildcard_name.py
index 07411f9..90864c1 100644
--- a/examples/tutorials/doc_examples/examples/wildcard_name.py
+++ b/examples/tutorials/doc_examples/examples/wildcard_name.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/wildcard_rules.py b/examples/tutorials/doc_examples/examples/wildcard_rules.py
index 22ca8c3..8cd63dd 100644
--- a/examples/tutorials/doc_examples/examples/wildcard_rules.py
+++ b/examples/tutorials/doc_examples/examples/wildcard_rules.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/doc_examples/examples/wizard.py b/examples/tutorials/doc_examples/examples/wizard.py
index 6b375a6..6e5f977 100644
--- a/examples/tutorials/doc_examples/examples/wizard.py
+++ b/examples/tutorials/doc_examples/examples/wizard.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/traits_4.0/decorators/cached_property.py b/examples/tutorials/traits_4.0/decorators/cached_property.py
index bc9b759..e7e3757 100644
--- a/examples/tutorials/traits_4.0/decorators/cached_property.py
+++ b/examples/tutorials/traits_4.0/decorators/cached_property.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/traits_4.0/decorators/on_trait_change.py b/examples/tutorials/traits_4.0/decorators/on_trait_change.py
index c5bc19d..8bc2a23 100644
--- a/examples/tutorials/traits_4.0/decorators/on_trait_change.py
+++ b/examples/tutorials/traits_4.0/decorators/on_trait_change.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/traits_4.0/delegation/delegation.py b/examples/tutorials/traits_4.0/delegation/delegation.py
index 1b0a5da..79d6d91 100644
--- a/examples/tutorials/traits_4.0/delegation/delegation.py
+++ b/examples/tutorials/traits_4.0/delegation/delegation.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/traits_4.0/extended_trait_change/extended_trait_change.py b/examples/tutorials/traits_4.0/extended_trait_change/extended_trait_change.py
index e83cde6..8d32416 100644
--- a/examples/tutorials/traits_4.0/extended_trait_change/extended_trait_change.py
+++ b/examples/tutorials/traits_4.0/extended_trait_change/extended_trait_change.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/traits_4.0/extended_trait_change/properties.py b/examples/tutorials/traits_4.0/extended_trait_change/properties.py
index dd843fb..80dccdc 100644
--- a/examples/tutorials/traits_4.0/extended_trait_change/properties.py
+++ b/examples/tutorials/traits_4.0/extended_trait_change/properties.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/traits_4.0/getstate_setstate/getstate.py b/examples/tutorials/traits_4.0/getstate_setstate/getstate.py
index f465e66..9913e2b 100644
--- a/examples/tutorials/traits_4.0/getstate_setstate/getstate.py
+++ b/examples/tutorials/traits_4.0/getstate_setstate/getstate.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/traits_4.0/interfaces/interfaces.py b/examples/tutorials/traits_4.0/interfaces/interfaces.py
index 5baebc2..2d4285b 100644
--- a/examples/tutorials/traits_4.0/interfaces/interfaces.py
+++ b/examples/tutorials/traits_4.0/interfaces/interfaces.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/traits_4.0/trait_types/core_traits.py b/examples/tutorials/traits_4.0/trait_types/core_traits.py
index 56c04f9..a6e6b92 100644
--- a/examples/tutorials/traits_4.0/trait_types/core_traits.py
+++ b/examples/tutorials/traits_4.0/trait_types/core_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/traits_4.0/trait_types/new_types.py b/examples/tutorials/traits_4.0/trait_types/new_types.py
index d1ca9cf..bbbc057 100644
--- a/examples/tutorials/traits_4.0/trait_types/new_types.py
+++ b/examples/tutorials/traits_4.0/trait_types/new_types.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/traits_4.0/trait_types/trait_types.py b/examples/tutorials/traits_4.0/trait_types/trait_types.py
index f2736db..d81a948 100644
--- a/examples/tutorials/traits_4.0/trait_types/trait_types.py
+++ b/examples/tutorials/traits_4.0/trait_types/trait_types.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/examples/tutorials/tutor.py b/examples/tutorials/tutor.py
index 26b17f7..50014cf 100644
--- a/examples/tutorials/tutor.py
+++ b/examples/tutorials/tutor.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..96043e9
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,15 @@
+[build-system]
+requires = ['setuptools', 'wheel']
+build-backend = 'setuptools.build_meta'
+
+[tool.black]
+line-length = 79
+target-version = ['py36']
+
+[tool.isort]
+profile = 'black'
+line_length = 79
+order_by_type = 'False'
+
+[tool.pytest.ini_options]
+addopts = '--ignore=traits-stubs'
diff --git a/setup.cfg b/setup.cfg
index bc68767..9eaada6 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,4 +1,7 @@
 [flake8]
-exclude = traits/observation/_generated_parser.py
+exclude = traits/observation/_generated_parser.py,build
 ignore = E266,W503,E722,E731,E741
-per-file-ignores = */api.py:F401
+per-file-ignores =
+    */api.py:F401
+    # Suppress flake8 complaints about black's formatting of .pyi files
+    *.pyi:E302,E305,E701,E704
diff --git a/setup.py b/setup.py
index 3807eb3..92d46ee 100644
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -19,15 +19,15 @@ import setuptools
 # together with information from the version control system, and then injected
 # into the package source.
 MAJOR = 6
-MINOR = 3
-MICRO = 2
+MINOR = 4
+MICRO = 1
 PRERELEASE = ""
 IS_RELEASED = True
 
 # If this file is part of a Git export (for example created with "git archive",
 # or downloaded from GitHub), ARCHIVE_COMMIT_HASH gives the full hash of the
 # commit that was exported.
-ARCHIVE_COMMIT_HASH = "6df2ff9bd1d21c74e688aff6f67a19fbbefdd53b"
+ARCHIVE_COMMIT_HASH = "5bb7f22adbc5e3b4416369e00002a47dcc4ff2aa"
 
 # Templates for version strings.
 RELEASED_VERSION = "{major}.{minor}.{micro}{prerelease}"
@@ -40,7 +40,7 @@ GIT_DIRECTORY = os.path.join(HERE, ".git")
 
 # Template for the autogenerated version file.
 VERSION_FILE_TEMPLATE = '''\
-# (C) Copyright 2005-2021 {company}, Inc., Austin, TX
+# (C) Copyright 2005-2022 {company}, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -281,6 +281,7 @@ setuptools.setup(
         Programming Language :: Python :: 3.8
         Programming Language :: Python :: 3.9
         Programming Language :: Python :: 3.10
+        Programming Language :: Python :: 3.11
         Programming Language :: Python :: Implementation :: CPython
         Topic :: Scientific/Engineering
         Topic :: Software Development
@@ -302,18 +303,20 @@ setuptools.setup(
     extras_require={
         "docs": [
             "enthought-sphinx-theme",
-            "Sphinx>=2.1.0,!=3.2.0",
+            "Sphinx>=2.1.0",
+            "sphinx-copybutton",
         ],
         "test": [
             "Cython",
             "flake8",
             "flake8-ets",
             "mypy",
-            "numpy; python_version<'3.10'",
+            "numpy",
             "pyface",
-            "PySide2; python_version<'3.10'",
+            "PySide2; python_version < '3.8'",
+            "PySide6; python_version >= '3.8' and python_version < '3.11'",
             "setuptools",
-            "Sphinx>=2.1.0,!=3.2.0",
+            "Sphinx>=2.1.0",
             "traitsui",
         ],
         "examples": [
diff --git a/traits-stubs/LICENSE.txt b/traits-stubs/LICENSE.txt
index 3af0fd1..6d143dd 100644
--- a/traits-stubs/LICENSE.txt
+++ b/traits-stubs/LICENSE.txt
@@ -1,7 +1,7 @@
 This software is OSI Certified Open Source Software.
 OSI Certified is a certification mark of the Open Source Initiative.
 
-(C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+(C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/traits-stubs/README.rst b/traits-stubs/README.rst
index 899eaa2..9cea742 100644
--- a/traits-stubs/README.rst
+++ b/traits-stubs/README.rst
@@ -26,6 +26,51 @@ Alternatively, some IDEs (including VS Code and PyCharm) can be configured to
 perform type checking as you edit.
 
 
+Development
+-----------
+
+To test traits stubs locally:
+
+- Create a fresh venv and activate it, for example with::
+
+  $ python -m venv --clear ~/.venvs/traits-stubs && source ~/.venvs/traits-stubs/bin/activate
+
+- Make sure all build-related packages are up to date
+
+  $ python -m pip install --upgrade pip setuptools wheel
+
+- Install the Traits library into the environment (non-editable install)
+
+  $ python -m pip install .
+
+- Install traits stubs in editable mode (from the repo, not from PyPI).
+
+  $ python -m pip install -e traits-stubs/
+
+- Install mypy (or your favourite type checker)
+
+  $ python -m pip install mypy
+
+- From the traits-stubs directory, run mypy on individual files in
+  traits_stubs_tests/examples with e.g.,
+
+  $ python -m mypy traits_stubs_tests/examples/completeness.py
+
+- From the traits-stubs directory, run the test suite with:
+
+  $ python -m unittest discover -v traits_stubs_tests
+
+Note: it's easy to get confusing results if you accidentally use the wrong
+version of mypy. To avoid that, you can make sure that you *don't* have mypy
+installed globally, and/or always invoke mypy using ``python -m mypy`` from
+within the environment.
+
+Note: the unittest run can give the wrong result in the presence of a stale
+``.mypy_cache``. If you're getting a pass where you expect to get a failure
+(or vice versa), try deleting the local cache and trying again.
+
+
+
 Dependencies
 ------------
 
diff --git a/traits-stubs/pyproject.toml b/traits-stubs/pyproject.toml
new file mode 100644
index 0000000..7e01ab2
--- /dev/null
+++ b/traits-stubs/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ['setuptools', 'wheel']
+build-backend = 'setuptools.build_meta'
diff --git a/traits-stubs/setup.py b/traits-stubs/setup.py
index 232ae44..3fc3903 100644
--- a/traits-stubs/setup.py
+++ b/traits-stubs/setup.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -12,7 +12,7 @@ import setuptools
 
 
 def get_long_description():
-    """ Read long description from README.rst. """
+    """Read long description from README.rst."""
     with open("README.rst", "r", encoding="utf-8") as readme:
         return readme.read()
 
@@ -20,7 +20,7 @@ def get_long_description():
 if __name__ == "__main__":
     setuptools.setup(
         name="traits-stubs",
-        version="6.1.0",
+        version="6.4.0",
         url="https://github.com/enthought/traits",
         author="Enthought",
         author_email="info@enthought.com",
@@ -39,6 +39,9 @@ if __name__ == "__main__":
             Programming Language :: Python :: 3.6
             Programming Language :: Python :: 3.7
             Programming Language :: Python :: 3.8
+            Programming Language :: Python :: 3.9
+            Programming Language :: Python :: 3.10
+            Programming Language :: Python :: 3.11
             Programming Language :: Python :: Implementation :: CPython
             Topic :: Scientific/Engineering
             Topic :: Software Development
@@ -52,14 +55,21 @@ if __name__ == "__main__":
         long_description=get_long_description(),
         long_description_content_type="text/x-rst",
         download_url="https://pypi.python.org/pypi/traits-stubs",
-        install_requires=["traits"],
+        install_requires=[
+            "traits",
+            # We need typing-extensions for SupportsIndex; once we no longer
+            # support Python < 3.8, we can drop this requirement.
+            'typing-extensions; python_version<"3.8"',
+        ],
         extras_require={"test": ["mypy"]},
         packages=[
             "traits-stubs",
             "traits_stubs_tests",
-            "traits_stubs_tests.examples",
         ],
-        package_data={"traits-stubs": ["./*.pyi", "./**/*.pyi"]},
+        package_data={
+            "traits-stubs": ["*.pyi"],
+            "traits_stubs_tests": ["examples/*.py", "numpy_examples/*.py"],
+        },
         license="BSD",
         python_requires=">=3.6",
     )
diff --git a/traits-stubs/traits-stubs/api.pyi b/traits-stubs/traits-stubs/api.pyi
index 7eb4820..53f608d 100644
--- a/traits-stubs/traits-stubs/api.pyi
+++ b/traits-stubs/traits-stubs/api.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -18,6 +18,12 @@ from .constants import (
     RICH_COMPARE as RICH_COMPARE,
 )
 
+from .trait_errors import (
+    TraitError as TraitError,
+    TraitNotificationError as TraitNotificationError,
+    DelegationError as DelegationError,
+)
+
 from .traits import (
     Color as Color,
     Default as Default,
@@ -193,3 +199,9 @@ from .trait_handlers import (
     TraitDict as TraitDict,
     TraitTuple as TraitTuple,
 )
+
+from .trait_numeric import (
+    Array as Array,
+    ArrayOrNone as ArrayOrNone,
+    CArray as CArray,
+)
diff --git a/traits-stubs/traits-stubs/base_trait_handler.pyi b/traits-stubs/traits-stubs/base_trait_handler.pyi
index 382e560..10d2501 100644
--- a/traits-stubs/traits-stubs/base_trait_handler.pyi
+++ b/traits-stubs/traits-stubs/base_trait_handler.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits-stubs/constants.pyi b/traits-stubs/traits-stubs/constants.pyi
index 63f75a1..3998c0b 100644
--- a/traits-stubs/traits-stubs/constants.pyi
+++ b/traits-stubs/traits-stubs/constants.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -11,6 +11,7 @@
 from enum import IntEnum
 from typing import Any
 
+
 class TraitKind(IntEnum):
     trait: int = ...
     python: int = ...
@@ -22,26 +23,31 @@ class TraitKind(IntEnum):
     constant: int = ...
     generic: int = ...
 
+
+# Alias for the built-in int type, to avoid confusion with the 'int' attribute
+# in the ValidateTrait namespace.
+_int = int
+
 class ValidateTrait(IntEnum):
-    type: int = ...
-    instance: int = ...
-    self_type: int = ...
-    int_range: int = ...
-    float_range: int = ...
-    enum: int = ...
-    map: int = ...
-    complex: int = ...
-    slow: int = ...
-    tuple: int = ...
-    prefix_map: int = ...
-    coerce: int = ...
-    cast: int = ...
-    function: int = ...
-    python: int = ...
-    adapt: int = ...
-    int: int = ...
-    float: int = ...
-    callable: int = ...
+    type: _int = ...
+    instance: _int = ...
+    self_type: _int = ...
+    int_range: _int = ...
+    float_range: _int = ...
+    enum: _int = ...
+    map: _int = ...
+    complex: _int = ...
+    slow: _int = ...
+    tuple: _int = ...
+    prefix_map: _int = ...
+    coerce: _int = ...
+    cast: _int = ...
+    function: _int = ...
+    python: _int = ...
+    adapt: _int = ...
+    int: _int = ...
+    float: _int = ...
+    callable: _int = ...
 
 class ComparisonMode(IntEnum):
     none: int = ...
diff --git a/traits-stubs/traits-stubs/ctrait.pyi b/traits-stubs/traits-stubs/ctrait.pyi
index f1e3a21..38facb4 100644
--- a/traits-stubs/traits-stubs/ctrait.pyi
+++ b/traits-stubs/traits-stubs/ctrait.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits-stubs/ctraits.pyi b/traits-stubs/traits-stubs/ctraits.pyi
new file mode 100644
index 0000000..b8f8952
--- /dev/null
+++ b/traits-stubs/traits-stubs/ctraits.pyi
@@ -0,0 +1,28 @@
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
+# All rights reserved.
+#
+# This software is provided without warranty under the terms of the BSD
+# license included in LICENSE.txt and may be redistributed only under
+# the conditions described in the aforementioned license. The license
+# is also available online at http://www.enthought.com/licenses/BSD.txt
+#
+# Thanks for using Enthought open source!
+
+from typing import Any
+
+# Constants used in DefaultValue enumeration.
+_CALLABLE_AND_ARGS_DEFAULT_VALUE: int
+_CALLABLE_DEFAULT_VALUE: int
+_CONSTANT_DEFAULT_VALUE: int
+_DICT_COPY_DEFAULT_VALUE: int
+_DISALLOW_DEFAULT_VALUE: int
+_LIST_COPY_DEFAULT_VALUE: int
+_MAXIMUM_DEFAULT_VALUE_TYPE: int
+_MISSING_DEFAULT_VALUE: int
+_OBJECT_DEFAULT_VALUE: int
+_TRAIT_DICT_OBJECT_DEFAULT_VALUE: int
+_TRAIT_LIST_OBJECT_DEFAULT_VALUE: int
+_TRAIT_SET_OBJECT_DEFAULT_VALUE: int
+
+def _validate_complex_number(value: Any) -> complex: ...
+def _validate_float(value: Any) -> float: ...
diff --git a/traits-stubs/traits-stubs/editor_factories.pyi b/traits-stubs/traits-stubs/editor_factories.pyi
index 1dec66a..2809d23 100644
--- a/traits-stubs/traits-stubs/editor_factories.pyi
+++ b/traits-stubs/traits-stubs/editor_factories.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits-stubs/has_traits.pyi b/traits-stubs/traits-stubs/has_traits.pyi
index 54f30b6..1b3a56c 100644
--- a/traits-stubs/traits-stubs/has_traits.pyi
+++ b/traits-stubs/traits-stubs/has_traits.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits-stubs/trait_handler.pyi b/traits-stubs/traits-stubs/trait_handler.pyi
index b77e94d..de1384b 100644
--- a/traits-stubs/traits-stubs/trait_handler.pyi
+++ b/traits-stubs/traits-stubs/trait_handler.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits-stubs/trait_handlers.pyi b/traits-stubs/traits-stubs/trait_handlers.pyi
index 212b88d..64107f3 100644
--- a/traits-stubs/traits-stubs/trait_handlers.pyi
+++ b/traits-stubs/traits-stubs/trait_handlers.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits-stubs/trait_numeric.pyi b/traits-stubs/traits-stubs/trait_numeric.pyi
new file mode 100644
index 0000000..02705e7
--- /dev/null
+++ b/traits-stubs/traits-stubs/trait_numeric.pyi
@@ -0,0 +1,68 @@
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
+# All rights reserved.
+#
+# This software is provided without warranty under the terms of the BSD
+# license included in LICENSE.txt and may be redistributed only under
+# the conditions described in the aforementioned license. The license
+# is also available online at http://www.enthought.com/licenses/BSD.txt
+#
+# Thanks for using Enthought open source!
+
+from typing import Any, List, Optional, Tuple, Type, Union
+
+import numpy as np
+
+from .trait_type import _TraitType
+
+# Things that are allowed as individual shape elements in the 'shape'
+# tuple or list.
+_ShapeElement = Union[None, int, Tuple[int, Union[None, int]]]
+
+# Type for the shape parameter.
+_Shape = Union[Tuple[_ShapeElement, ...], List[_ShapeElement]]
+
+# The "Array" trait type is not as permissive as NumPy's asarray: it
+# accepts only NumPy arrays, lists and tuples.
+_ArrayLike = Union[List[Any], Tuple[Any, ...], np.ndarray[Any, Any]]
+
+# Synonym for the "stores" type of the trait.
+_Array = np.ndarray[Any, Any]
+
+# Things that are accepted as dtypes. This doesn't attempt to cover
+# all legal possibilities - only those that are common.
+_DTypeLike = Union[np.dtype[Any], Type[Any], str]
+
+class Array(_TraitType[_ArrayLike, _Array]):
+    def __init__(
+        self,
+        dtype: Optional[_DTypeLike] = ...,
+        shape: Optional[_Shape] = ...,
+        value: Optional[_ArrayLike] = ...,
+        *,
+        casting: str = ...,
+        **metadata: Any,
+    ) -> None: ...
+
+class ArrayOrNone(
+    _TraitType[Optional[_ArrayLike], Optional[_Array]]
+):
+    def __init__(
+        self,
+        dtype: Optional[_DTypeLike] = ...,
+        shape: Optional[_Shape] = ...,
+        value: Optional[_ArrayLike] = ...,
+        *,
+        casting: str = ...,
+        **metadata: Any,
+    ) -> None: ...
+
+class CArray(_TraitType[_ArrayLike, _Array]):
+    def __init__(
+        self,
+        dtype: Optional[_DTypeLike] = ...,
+        shape: Optional[_Shape] = ...,
+        value: Optional[_ArrayLike] = ...,
+        *,
+        casting: str = ...,
+        **metadata: Any,
+    ) -> None: ...
diff --git a/traits-stubs/traits-stubs/trait_type.pyi b/traits-stubs/traits-stubs/trait_type.pyi
index ec9a520..d2e5e18 100644
--- a/traits-stubs/traits-stubs/trait_type.pyi
+++ b/traits-stubs/traits-stubs/trait_type.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits-stubs/trait_types.pyi b/traits-stubs/traits-stubs/trait_types.pyi
index 952a1a2..9682a23 100644
--- a/traits-stubs/traits-stubs/trait_types.pyi
+++ b/traits-stubs/traits-stubs/trait_types.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -10,6 +10,7 @@
 
 import datetime
 from pathlib import PurePath as _PurePath
+import sys
 from typing import (
     Any as _Any,
     Callable as _CallableType,
@@ -18,27 +19,36 @@ from typing import (
     Optional,
     Sequence as _Sequence,
     Set as _SetType,
+    SupportsFloat,
+    Tuple as _Tuple,
     Type as _Type,
     TypeVar,
     Union as _Union,
 )
 from uuid import UUID as _UUID
 
+# Once we no longer support Python 3.6 or Python 3.7, we can import
+# SupportsIndex from typing instead of typing_extensions.
+if sys.version_info < (3, 8):
+    from typing_extensions import SupportsIndex
+else:
+    from typing import SupportsIndex
+
 from .trait_type import _TraitType
 
 SetTypes: _Any
-int_fast_validate: _Any
-float_fast_validate: _Any
-complex_fast_validate: _Any
 bool_fast_validate: _Any
 
 
-def default_text_editor(trait: _Any, type: Optional[_Any] = ...):
+def default_text_editor(trait: _Any, type: Optional[_Any] = ...) -> _Any:
     ...
 
 
-_T = TypeVar("_T")
 _S = TypeVar("_S")
+_T = TypeVar("_T")
+_U = TypeVar("_U")
+_V = TypeVar("_V")
+
 
 _Trait = _Union[_TraitType[_S, _T], _Type[_TraitType[_S, _T]]]
 
@@ -48,9 +58,9 @@ class Any(_TraitType[_Any, _Any]):
         self,
         default_value: _Any = ...,
         *,
-        factory: _CallableType = ...,
-        args: tuple = ...,
-        kw: dict = ...,
+        factory: _CallableType[..., _Any] = ...,
+        args: _Tuple[_Any, ...] = ...,
+        kw: _DictType[str, _Any] = ...,
         **metadata: _Any,
     ) -> None:
         ...
@@ -60,7 +70,7 @@ class _BaseInt(_TraitType[_T, int]):
     ...
 
 
-class BaseInt(_BaseInt[int]):
+class BaseInt(_TraitType[SupportsIndex, int]):
     ...
 
 
@@ -72,7 +82,7 @@ class _BaseFloat(_TraitType[_T, float]):
     ...
 
 
-class BaseFloat(_BaseFloat[float]):
+class BaseFloat(_TraitType[_Union[SupportsFloat, SupportsIndex], float]):
     ...
 
 
@@ -194,12 +204,12 @@ class _String(_TraitType[_T, str]):
 
 class String(_String[str]):
     def __init__(
-            self,
-            value: str = ...,
-            minlen: int = ...,
-            maxlen: int = ...,
-            regex: str = ...,
-            **metadata: _Any
+        self,
+        value: str = ...,
+        minlen: int = ...,
+        maxlen: int = ...,
+        regex: str = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
@@ -227,7 +237,7 @@ class _BaseCallable(_TraitType[_OptionalCallable, _OptionalCallable]):
     ...
 
 
-class BaseCallable(_BaseCallable[_CallableType[..., _Any]]):
+class BaseCallable(_BaseCallable):
     ...
 
 
@@ -277,12 +287,12 @@ class Constant(_TraitType[_Any, _Any]):
 
 class Delegate(_TraitType[_Any, _Any]):
     def __init__(
-            self,
-            delegate: str = ...,
-            prefix: str = ...,
-            modify: bool = ...,
-            listenable: bool = ...,
-            **metadata: _Any
+        self,
+        delegate: str = ...,
+        prefix: str = ...,
+        modify: bool = ...,
+        listenable: bool = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
@@ -305,13 +315,13 @@ class PythonValue(Any):
 
 class BaseFile(_TraitType[_Union[str, _PurePath], str]):
     def __init__(
-            self,
-            value: str = ...,
-            filter: str = ...,
-            auto_set: bool = ...,
-            entries: int = ...,
-            exists: bool = ...,
-            **metadata: _Any
+        self,
+        value: str = ...,
+        filter: str = ...,
+        auto_set: bool = ...,
+        entries: int = ...,
+        exists: bool = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
@@ -320,7 +330,7 @@ class File(BaseFile):
     ...
 
 
-class BaseDirectory(_BaseStr):
+class BaseDirectory(_TraitType[_Union[str, _PurePath], str]):
     ...
 
 
@@ -331,13 +341,13 @@ class Directory(BaseDirectory):
 # ----------------BaseRange---------------------
 class _BaseRange(_TraitType[_T, _Union[int, float]]):
     def __init__(
-            self,
-            low: _Union[int, float, str] = ...,
-            high: _Union[int, float, str] = ...,
-            value: _Union[int, float, str] = ...,
-            exclude_low: bool = ...,
-            exclude_high: bool = ...,
-            **metadata: _Any
+        self,
+        low: _Union[int, float, str] = ...,
+        high: _Union[int, float, str] = ...,
+        value: _Union[int, float, str] = ...,
+        exclude_low: bool = ...,
+        exclude_high: bool = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
@@ -352,9 +362,9 @@ class Range(BaseRange):
 
 class _BaseEnum(_TraitType[_T, _Any]):
     def __init__(
-            self,
-            *args: _Any,
-            **metadata: _Any,
+        self,
+        *args: _Any,
+        **metadata: _Any,
     ) -> None:
         ...
 
@@ -367,16 +377,16 @@ class Enum(BaseEnum):
     ...
 
 
-class _BaseTuple(_TraitType[_T, tuple]):
+class _BaseTuple(_TraitType[_T, _Tuple[_Any, ...]]):
     def __init__(
-            self,
-            *types: _Any,
-            **metadata: _Any,
+        self,
+        *types: _Any,
+        **metadata: _Any,
     ) -> None:
         ...
 
 
-class BaseTuple(_BaseTuple[tuple]):
+class BaseTuple(_BaseTuple[_Tuple[_Any, ...]]):
     ...
 
 
@@ -386,24 +396,24 @@ class Tuple(BaseTuple):
 
 class ValidatedTuple(BaseTuple):
     def __init__(
-            self,
-            *types: _Any,
-            fvalidate: _OptionalCallable = ...,
-            fvalidate_info: Optional[str] = ...,
-            **metadata: _Any
+        self,
+        *types: _Any,
+        fvalidate: _OptionalCallable = ...,
+        fvalidate_info: Optional[str] = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
 
 class _List(_TraitType[_Sequence[_S], _ListType[_T]]):
     def __init__(
-            self,
-            trait: _Union[_TraitType[_S, _T], _Type[_TraitType[_S, _T]]] = ...,
-            value: _Sequence[_S] = [],
-            minlen: int = ...,
-            maxlen: int = ...,
-            items: bool = ...,
-            **metadata: _Any
+        self,
+        trait: _Union[_TraitType[_S, _T], _Type[_TraitType[_S, _T]]] = ...,
+        value: _Sequence[_S] = ...,
+        minlen: int = ...,
+        maxlen: int = ...,
+        items: bool = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
@@ -418,20 +428,20 @@ class CList(_List[_S, _T]):
 
 class PrefixList(BaseStr):
     def __init__(
-            self,
-            values: _Sequence[str],
-            **metadata: _Any,
+        self,
+        values: _Sequence[str],
+        **metadata: _Any,
     ) -> None:
         ...
 
 
 class _Set(_TraitType[_SetType[_S], _SetType[_T]]):
     def __init__(
-            self,
-            trait: _Union[_TraitType[_S, _T], _Type[_TraitType[_S, _T]]] = ...,
-            value: _Sequence[_S] = ...,
-            items: bool = ...,
-            **metadata: _Any
+        self,
+        trait: _Union[_TraitType[_S, _T], _Type[_TraitType[_S, _T]]] = ...,
+        value: _Sequence[_S] = ...,
+        items: bool = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
@@ -440,51 +450,54 @@ class Set(_Set[_S, _T]):
     ...
 
 
-class CSet(Set):
+class CSet(Set[_S, _T]):
     ...
 
 
-class _Dict(_TraitType[_DictType[_S, _T], _DictType[_S, _T]]):
+# _Dict accepts a dictionary with key type _S and value type _T,
+# and stores a dictionary with key type _U and value type _V.
+
+class _Dict(_TraitType[_DictType[_S, _T], _DictType[_U, _V]]):
     def __init__(
-            self,
-            key_trait: _Union[
-                _TraitType[_S, _T], _Type[_TraitType[_S, _T]]] = ...,
-            value_trait: _Union[
-                _TraitType[_S, _T], _Type[_TraitType[_S, _T]]] = ...,
-            value: dict = ...,
-            items: bool = ...,
-            **metadata: _Any
+        self,
+        key_trait: _Union[
+            _TraitType[_S, _U], _Type[_TraitType[_S, _U]]] = ...,
+        value_trait: _Union[
+            _TraitType[_T, _V], _Type[_TraitType[_T, _V]]] = ...,
+        value: _DictType[_S, _T] = ...,
+        items: bool = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
 
-class Dict(_Dict[_S, _T]):
+class Dict(_Dict[_S, _T, _U, _V]):
     ...
 
 
 class _Map(_TraitType[_S, _T]):
     def __init__(
-            self,
-            map: _DictType[_S, _T],
-            **metadata: _Any
+        self,
+        map: _DictType[_S, _T],
+        **metadata: _Any
     ) -> None:
         ...
 
 
-class Map(_Map):
+class Map(_Map[_Any, _Any]):
     ...
 
 
 class _PrefixMap(_TraitType[_S, _T]):
     def __init__(
-            self,
-            map: _DictType[_S, _T],
-            **metadata: _Any
+        self,
+        map: _DictType[_S, _T],
+        **metadata: _Any
     ) -> None:
         ...
 
 
-class PrefixMap(_PrefixMap):
+class PrefixMap(_PrefixMap[_Any, _Any]):
     ...
 
 
@@ -492,7 +505,7 @@ class _BaseClass(_TraitType[_Union[_T, str, None], _Union[_T, str, None]]):
     ...
 
 
-class BaseClass(_BaseClass[_Type]):
+class BaseClass(_BaseClass[_Type[_Any]]):
     ...
 
 
@@ -500,10 +513,10 @@ class _BaseInstance(_BaseClass[_T]):
 
     # simplified signature
     def __init__(
-            self,
-            klass: _T,
-            *args,
-            **metadata: _Any,
+        self,
+        klass: _T,
+        *args: _Any,
+        **metadata: _Any,
     ) -> None:
         ...
 
@@ -526,11 +539,11 @@ class AdaptsTo(Supports):
 
 class Type(BaseClass):
     def __init__(
-            self,
-            value: Optional[_Type] = ...,
-            klass: Optional[_Union[_Type, str]] = ...,
-            allow_none: bool = ...,
-            **metadata: _Any
+        self,
+        value: Optional[_Type[_Any]] = ...,
+        klass: Optional[_Union[_Type[_Any], str]] = ...,
+        allow_none: bool = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
@@ -545,48 +558,48 @@ class Event(_TraitType[_Any, _Any]):
 
 class Button(Event):
     def __init__(
-            self,
-            label: str = ...,
-            image: _Any = ...,
-            style: str = ...,
-            values_trait: str = ...,
-            orientation: str = ...,
-            width_padding: int = ...,
-            height_padding: int = ...,
-            view: Optional[_Any] = ...,
-            **metadata: _Any
+        self,
+        label: str = ...,
+        image: _Any = ...,
+        style: str = ...,
+        values_trait: str = ...,
+        orientation: str = ...,
+        width_padding: int = ...,
+        height_padding: int = ...,
+        view: Optional[_Any] = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
 
 class ToolbarButton(Button):
     def __init__(
-            self,
-            label: str = ...,
-            image: _Any = ...,
-            style: str = ...,
-            orientation: str = ...,
-            width_padding: int = ...,
-            height_padding: int = ...,
-            **metadata: _Any
+        self,
+        label: str = ...,
+        image: _Any = ...,
+        style: str = ...,
+        orientation: str = ...,
+        width_padding: int = ...,
+        height_padding: int = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
 
 class Either(_TraitType[_Any, _Any]):
     def __init__(
-            self,
-            *traits: _Any,
-            **metadata: _Any
+        self,
+        *traits: _Any,
+        **metadata: _Any
     ) -> None:
         ...
 
 
 class Union(_TraitType[_Any, _Any]):
     def __init__(
-            self,
-            *traits: _Any,
-            **metadata: _Any
+        self,
+        *traits: _Any,
+        **metadata: _Any
     ) -> None:
         ...
 
@@ -597,20 +610,20 @@ class Symbol(_TraitType[_Any, _Any]):
 
 class UUID(_TraitType[_Union[str, _UUID], _UUID]):
     def __init__(
-            self,
-            can_init: bool = ...,
-            **metadata: _Any
+        self,
+        can_init: bool = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
 
 class WeakRef(Instance):
     def __init__(
-            self,
-            klass: _Any = ...,
-            allow_none: bool = ...,
-            adapt: str = ...,
-            **metadata: _Any
+        self,
+        klass: _Any = ...,
+        allow_none: bool = ...,
+        adapt: str = ...,
+        **metadata: _Any
     ) -> None:
         ...
 
@@ -620,12 +633,12 @@ _OptionalDate = Optional[datetime.date]
 
 class Date(_TraitType[_OptionalDate, _OptionalDate]):
     def __init__(
-            self,
-            default_value: datetime.date = ...,
-            *,
-            allow_datetime: bool = ...,
-            allow_none: bool = ...,
-            **metadata: _Any,
+        self,
+        default_value: datetime.date = ...,
+        *,
+        allow_datetime: bool = ...,
+        allow_none: bool = ...,
+        **metadata: _Any,
     ) -> None:
         ...
 
@@ -635,11 +648,11 @@ _OptionalDatetime = Optional[datetime.datetime]
 
 class Datetime(_TraitType[_OptionalDatetime, _OptionalDatetime]):
     def __init__(
-            self,
-            default_value: datetime.datetime = ...,
-            *,
-            allow_none: bool = ...,
-            **metadata: _Any,
+        self,
+        default_value: datetime.datetime = ...,
+        *,
+        allow_none: bool = ...,
+        **metadata: _Any,
     ) -> None:
         ...
 
@@ -649,11 +662,11 @@ _OptionalTime = Optional[datetime.time]
 
 class Time(_TraitType[_OptionalTime, _OptionalTime]):
     def __init__(
-            self,
-            default_value: datetime.time = ...,
-            *,
-            allow_none: bool = ...,
-            **metadata: _Any,
+        self,
+        default_value: datetime.time = ...,
+        *,
+        allow_none: bool = ...,
+        **metadata: _Any,
     ) -> None:
         ...
 
@@ -733,37 +746,37 @@ class ListBool(_List[bool, bool]):
     ...
 
 
-class ListFunction(_List[_CallableType, _CallableType]):
+class ListFunction(_List[_CallableType[..., _Any], _CallableType[..., _Any]]):
     ...
 
 
-class ListMethod(_List[_CallableType, _CallableType]):
+class ListMethod(_List[_CallableType[..., _Any], _CallableType[..., _Any]]):
     ...
 
 
-class ListThis(_List[_CallableType, _CallableType]):
+class ListThis(_List[_CallableType[..., _Any], _CallableType[..., _Any]]):
     ...
 
 
-class DictStrAny(_Dict[str, _Any]):
+class DictStrAny(_Dict[str, _Any, str, _Any]):
     ...
 
 
-class DictStrStr(_Dict[str, str]):
+class DictStrStr(_Dict[str, str, str, str]):
     ...
 
 
-class DictStrInt(_Dict[str, int]):
+class DictStrInt(_Dict[str, int, str, int]):
     ...
 
 
-class DictStrFloat(_Dict[str, float]):
+class DictStrFloat(_Dict[str, float, str, float]):
     ...
 
 
-class DictStrBool(_Dict[str, bool]):
+class DictStrBool(_Dict[str, bool, str, bool]):
     ...
 
 
-class DictStrList(_Dict[str, list]):
+class DictStrList(_Dict[str, _ListType[Any], str, _ListType[Any]]):
     ...
diff --git a/traits-stubs/traits-stubs/traits.pyi b/traits-stubs/traits-stubs/traits.pyi
index 2248d08..dcceddc 100644
--- a/traits-stubs/traits-stubs/traits.pyi
+++ b/traits-stubs/traits-stubs/traits.pyi
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Any.py b/traits-stubs/traits_stubs_tests/examples/Any.py
index 4530077..5471025 100644
--- a/traits-stubs/traits_stubs_tests/examples/Any.py
+++ b/traits-stubs/traits_stubs_tests/examples/Any.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/BaseClass.py b/traits-stubs/traits_stubs_tests/examples/BaseClass.py
index 1f82565..57fe233 100644
--- a/traits-stubs/traits_stubs_tests/examples/BaseClass.py
+++ b/traits-stubs/traits_stubs_tests/examples/BaseClass.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Bool.py b/traits-stubs/traits_stubs_tests/examples/Bool.py
index 91c75d0..2acf1dd 100644
--- a/traits-stubs/traits_stubs_tests/examples/Bool.py
+++ b/traits-stubs/traits_stubs_tests/examples/Bool.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/CInt.py b/traits-stubs/traits_stubs_tests/examples/CInt.py
index 4c28439..2fc89c1 100644
--- a/traits-stubs/traits_stubs_tests/examples/CInt.py
+++ b/traits-stubs/traits_stubs_tests/examples/CInt.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Callable.py b/traits-stubs/traits_stubs_tests/examples/Callable.py
index ee4abc9..0a481fb 100644
--- a/traits-stubs/traits_stubs_tests/examples/Callable.py
+++ b/traits-stubs/traits_stubs_tests/examples/Callable.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Complex.py b/traits-stubs/traits_stubs_tests/examples/Complex.py
index b1701ab..eb2cfef 100644
--- a/traits-stubs/traits_stubs_tests/examples/Complex.py
+++ b/traits-stubs/traits_stubs_tests/examples/Complex.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Date.py b/traits-stubs/traits_stubs_tests/examples/Date.py
index 3b4a58c..ad5294c 100644
--- a/traits-stubs/traits_stubs_tests/examples/Date.py
+++ b/traits-stubs/traits_stubs_tests/examples/Date.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Datetime.py b/traits-stubs/traits_stubs_tests/examples/Datetime.py
index 839525e..5ff933b 100644
--- a/traits-stubs/traits_stubs_tests/examples/Datetime.py
+++ b/traits-stubs/traits_stubs_tests/examples/Datetime.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Dict.py b/traits-stubs/traits_stubs_tests/examples/Dict.py
index 6e8ac75..7f4191a 100644
--- a/traits-stubs/traits_stubs_tests/examples/Dict.py
+++ b/traits-stubs/traits_stubs_tests/examples/Dict.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/DictStrAny.py b/traits-stubs/traits_stubs_tests/examples/DictStrAny.py
index d1d4ca1..490afc5 100644
--- a/traits-stubs/traits_stubs_tests/examples/DictStrAny.py
+++ b/traits-stubs/traits_stubs_tests/examples/DictStrAny.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/DictStrFloat.py b/traits-stubs/traits_stubs_tests/examples/DictStrFloat.py
index 69b0807..562c124 100644
--- a/traits-stubs/traits_stubs_tests/examples/DictStrFloat.py
+++ b/traits-stubs/traits_stubs_tests/examples/DictStrFloat.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/DictStrInt.py b/traits-stubs/traits_stubs_tests/examples/DictStrInt.py
index 5730176..0b6dc9c 100644
--- a/traits-stubs/traits_stubs_tests/examples/DictStrInt.py
+++ b/traits-stubs/traits_stubs_tests/examples/DictStrInt.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Enum.py b/traits-stubs/traits_stubs_tests/examples/Enum.py
index 6d15970..28e7dc3 100644
--- a/traits-stubs/traits_stubs_tests/examples/Enum.py
+++ b/traits-stubs/traits_stubs_tests/examples/Enum.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/File.py b/traits-stubs/traits_stubs_tests/examples/File.py
index 64a4396..2713f90 100644
--- a/traits-stubs/traits_stubs_tests/examples/File.py
+++ b/traits-stubs/traits_stubs_tests/examples/File.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Float.py b/traits-stubs/traits_stubs_tests/examples/Float.py
index 12f57e8..22040fa 100644
--- a/traits-stubs/traits_stubs_tests/examples/Float.py
+++ b/traits-stubs/traits_stubs_tests/examples/Float.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -11,6 +11,18 @@
 from traits.api import Float, HasTraits
 
 
+class HasIndex:
+    """Class with __index__ method; instances should be assignable to Float."""
+    def __index__(self):
+        return 1729
+
+
+class HasFloat:
+    """Class with __float__ method; instances should be assignable to Float."""
+    def __float__(self):
+        return 1729.0
+
+
 class Test(HasTraits):
     i = Float()
 
@@ -19,3 +31,5 @@ o = Test()
 o.i = "5"  # E: assignment
 o.i = 5
 o.i = 5.5
+o.i = HasIndex()
+o.i = HasFloat()
diff --git a/traits-stubs/traits_stubs_tests/examples/HasStrictTraits.py b/traits-stubs/traits_stubs_tests/examples/HasStrictTraits.py
index cb074bd..bafdb6e 100644
--- a/traits-stubs/traits_stubs_tests/examples/HasStrictTraits.py
+++ b/traits-stubs/traits_stubs_tests/examples/HasStrictTraits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/HasTraits.py b/traits-stubs/traits_stubs_tests/examples/HasTraits.py
index 2870793..c400fbd 100644
--- a/traits-stubs/traits_stubs_tests/examples/HasTraits.py
+++ b/traits-stubs/traits_stubs_tests/examples/HasTraits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Instance.py b/traits-stubs/traits_stubs_tests/examples/Instance.py
index 0fa5dec..e01111e 100644
--- a/traits-stubs/traits_stubs_tests/examples/Instance.py
+++ b/traits-stubs/traits_stubs_tests/examples/Instance.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Int.py b/traits-stubs/traits_stubs_tests/examples/Int.py
index 7ba7de4..805e18d 100644
--- a/traits-stubs/traits_stubs_tests/examples/Int.py
+++ b/traits-stubs/traits_stubs_tests/examples/Int.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -11,6 +11,12 @@
 from traits.api import HasTraits, Int
 
 
+class HasIndex:
+    """Class with __index__ method; instances should be assignable to Int."""
+    def __index__(self):
+        return 1729
+
+
 class Test(HasTraits):
     i = Int()
     j = Int(default_value="234")  # E: arg-type
@@ -19,6 +25,7 @@ class Test(HasTraits):
 
 o = Test()
 o.i = 5
+o.i = HasIndex()
 
 o.i = "5"  # E: assignment
 o.i = 5.5  # E: assignment
diff --git a/traits-stubs/traits_stubs_tests/examples/Interface.py b/traits-stubs/traits_stubs_tests/examples/Interface.py
index b29d942..683bf1b 100644
--- a/traits-stubs/traits_stubs_tests/examples/Interface.py
+++ b/traits-stubs/traits_stubs_tests/examples/Interface.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/List.py b/traits-stubs/traits_stubs_tests/examples/List.py
index 63b7bc5..aaa9575 100644
--- a/traits-stubs/traits_stubs_tests/examples/List.py
+++ b/traits-stubs/traits_stubs_tests/examples/List.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/ListBool.py b/traits-stubs/traits_stubs_tests/examples/ListBool.py
index 5c548cf..a921d6a 100644
--- a/traits-stubs/traits_stubs_tests/examples/ListBool.py
+++ b/traits-stubs/traits_stubs_tests/examples/ListBool.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/ListComplex.py b/traits-stubs/traits_stubs_tests/examples/ListComplex.py
index 6955780..416bef8 100644
--- a/traits-stubs/traits_stubs_tests/examples/ListComplex.py
+++ b/traits-stubs/traits_stubs_tests/examples/ListComplex.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/ListFloat.py b/traits-stubs/traits_stubs_tests/examples/ListFloat.py
index 18843b7..f0a19ed 100644
--- a/traits-stubs/traits_stubs_tests/examples/ListFloat.py
+++ b/traits-stubs/traits_stubs_tests/examples/ListFloat.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/ListInt.py b/traits-stubs/traits_stubs_tests/examples/ListInt.py
index 60defa0..d8f511e 100644
--- a/traits-stubs/traits_stubs_tests/examples/ListInt.py
+++ b/traits-stubs/traits_stubs_tests/examples/ListInt.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Map.py b/traits-stubs/traits_stubs_tests/examples/Map.py
index a89d427..c2585e2 100644
--- a/traits-stubs/traits_stubs_tests/examples/Map.py
+++ b/traits-stubs/traits_stubs_tests/examples/Map.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/PrefixList.py b/traits-stubs/traits_stubs_tests/examples/PrefixList.py
index ce725c6..6164547 100644
--- a/traits-stubs/traits_stubs_tests/examples/PrefixList.py
+++ b/traits-stubs/traits_stubs_tests/examples/PrefixList.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/PrefixMap.py b/traits-stubs/traits_stubs_tests/examples/PrefixMap.py
index 89ecb1c..e334089 100644
--- a/traits-stubs/traits_stubs_tests/examples/PrefixMap.py
+++ b/traits-stubs/traits_stubs_tests/examples/PrefixMap.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Property.py b/traits-stubs/traits_stubs_tests/examples/Property.py
index 276ccb3..8dba6f5 100644
--- a/traits-stubs/traits_stubs_tests/examples/Property.py
+++ b/traits-stubs/traits_stubs_tests/examples/Property.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Range.py b/traits-stubs/traits_stubs_tests/examples/Range.py
index 9c0b045..3288101 100644
--- a/traits-stubs/traits_stubs_tests/examples/Range.py
+++ b/traits-stubs/traits_stubs_tests/examples/Range.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Set.py b/traits-stubs/traits_stubs_tests/examples/Set.py
index 92964a8..3e0ed97 100644
--- a/traits-stubs/traits_stubs_tests/examples/Set.py
+++ b/traits-stubs/traits_stubs_tests/examples/Set.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Str.py b/traits-stubs/traits_stubs_tests/examples/Str.py
index ac4c9ea..9889faa 100644
--- a/traits-stubs/traits_stubs_tests/examples/Str.py
+++ b/traits-stubs/traits_stubs_tests/examples/Str.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/String.py b/traits-stubs/traits_stubs_tests/examples/String.py
index 9e6f8d3..68c32f1 100644
--- a/traits-stubs/traits_stubs_tests/examples/String.py
+++ b/traits-stubs/traits_stubs_tests/examples/String.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Time.py b/traits-stubs/traits_stubs_tests/examples/Time.py
index be0fc22..d3d7876 100644
--- a/traits-stubs/traits_stubs_tests/examples/Time.py
+++ b/traits-stubs/traits_stubs_tests/examples/Time.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/TraitDict.py b/traits-stubs/traits_stubs_tests/examples/TraitDict.py
index 9420c19..c7a3ffe 100644
--- a/traits-stubs/traits_stubs_tests/examples/TraitDict.py
+++ b/traits-stubs/traits_stubs_tests/examples/TraitDict.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/Tuple.py b/traits-stubs/traits_stubs_tests/examples/Tuple.py
index 76d90c3..876c9e2 100644
--- a/traits-stubs/traits_stubs_tests/examples/Tuple.py
+++ b/traits-stubs/traits_stubs_tests/examples/Tuple.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/UUID.py b/traits-stubs/traits_stubs_tests/examples/UUID.py
index afa469c..b2b7c9b 100644
--- a/traits-stubs/traits_stubs_tests/examples/UUID.py
+++ b/traits-stubs/traits_stubs_tests/examples/UUID.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/WeakRef.py b/traits-stubs/traits_stubs_tests/examples/WeakRef.py
index 6237aaf..16e6906 100644
--- a/traits-stubs/traits_stubs_tests/examples/WeakRef.py
+++ b/traits-stubs/traits_stubs_tests/examples/WeakRef.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits-stubs/traits_stubs_tests/examples/__init__.py b/traits-stubs/traits_stubs_tests/examples/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/traits-stubs/traits_stubs_tests/examples/completeness.py b/traits-stubs/traits_stubs_tests/examples/completeness.py
new file mode 100644
index 0000000..40c863a
--- /dev/null
+++ b/traits-stubs/traits_stubs_tests/examples/completeness.py
@@ -0,0 +1,26 @@
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
+# All rights reserved.
+#
+# This software is provided without warranty under the terms of the BSD
+# license included in LICENSE.txt and may be redistributed only under
+# the conditions described in the aforementioned license. The license
+# is also available online at http://www.enthought.com/licenses/BSD.txt
+#
+# Thanks for using Enthought open source!
+
+"""
+A selection of code snippets used to test completeness of the stubs.
+"""
+
+from traits.api import HasStrictTraits, Str, TraitError
+
+
+class HasName(HasStrictTraits):
+    name = Str()
+
+
+def try_assigning_age(x: HasName, new_name: str):
+    try:
+        x.age = new_name
+    except TraitError:
+        raise ValueError(f"Bad age: {new_name}")
diff --git a/traits-stubs/traits_stubs_tests/numpy_examples/Array.py b/traits-stubs/traits_stubs_tests/numpy_examples/Array.py
new file mode 100644
index 0000000..f0b17c4
--- /dev/null
+++ b/traits-stubs/traits_stubs_tests/numpy_examples/Array.py
@@ -0,0 +1,44 @@
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
+# All rights reserved.
+#
+# This software is provided without warranty under the terms of the BSD
+# license included in LICENSE.txt and may be redistributed only under
+# the conditions described in the aforementioned license. The license
+# is also available online at http://www.enthought.com/licenses/BSD.txt
+#
+# Thanks for using Enthought open source!
+
+import numpy as np
+
+from traits.api import Array, ArrayOrNone, CArray, HasTraits
+
+
+class HasArrayTraits(HasTraits):
+    spectrum = Array(shape=(None,), dtype=np.float64)
+    complex_shape = Array(shape=((512, None), (512, None), (3, 4)))
+    list_shape = Array(shape=[(512, None), (512, None), (3, 4)])
+    str_dtype = Array(dtype="f4")
+    dtype_dtype = Array(dtype=np.dtype("float"))
+    with_default_value = Array(value=np.zeros(5))
+    with_list_default = Array(value=[1, 2, 3, 4, 5])
+    with_tuple_default = Array(value=(1, 2, 3, 4, 5))
+    with_casting = Array(casting="same_kind")
+
+    maybe_image = ArrayOrNone(shape=(None, None, 3), dtype=np.float64)
+    cspectrum = CArray(shape=(None,), dtype=np.float64)
+
+    # Bad trait declarations
+    bad_dtype = Array(dtype=62)  # E: arg-type
+    bad_default = Array(value=123)  # E: arg-type
+    bad_shape = Array(shape=3)  # E: arg-type
+    bad_shape_element = Array(shape=(3, (None, None)))  # E: arg-type
+
+
+obj = HasArrayTraits()
+obj.spectrum = np.array([2, 3, 4], dtype=np.float64)
+obj.spectrum = "not an array"  # E: assignment
+obj.spectrum = None  # E: assignment
+
+obj.maybe_image = None
+obj.maybe_image = np.zeros((5, 5, 3))
+obj.maybe_image = 2.3  # E: assignment
diff --git a/traits-stubs/traits_stubs_tests/test_all.py b/traits-stubs/traits_stubs_tests/test_all.py
index a648814..8547325 100644
--- a/traits-stubs/traits_stubs_tests/test_all.py
+++ b/traits-stubs/traits_stubs_tests/test_all.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -15,14 +15,15 @@ from unittest import TestCase
 from traits.testing.optional_dependencies import (
     pkg_resources,
     requires_mypy,
+    requires_numpy_typing,
     requires_pkg_resources,
 )
 from traits_stubs_tests.util import MypyAssertions
 
 
+@requires_pkg_resources
 @requires_mypy
 class TestAnnotations(TestCase, MypyAssertions):
-    @requires_pkg_resources
     def test_all(self, filename_suffix=""):
         """ Run mypy for all files contained in traits_stubs_tests/examples
         directory.
@@ -41,3 +42,23 @@ class TestAnnotations(TestCase, MypyAssertions):
         for file_path in examples_dir.glob("*{}.py".format(filename_suffix)):
             with self.subTest(file_path=file_path):
                 self.assertRaisesMypyError(file_path)
+
+    @requires_numpy_typing
+    def test_numpy_examples(self):
+        """ Run mypy for files contained in traits_stubs_tests/numpy_examples
+        directory.
+
+        Lines with expected errors are marked inside these files.
+        Any mismatch will raise an assertion error.
+
+        Parameters
+        ----------
+        filename_suffix: str
+            Optional filename suffix filter.
+        """
+        examples_dir = Path(pkg_resources.resource_filename(
+            'traits_stubs_tests', 'numpy_examples'))
+
+        for file_path in examples_dir.glob("*.py"):
+            with self.subTest(file_path=file_path):
+                self.assertRaisesMypyError(file_path)
diff --git a/traits-stubs/traits_stubs_tests/util.py b/traits-stubs/traits_stubs_tests/util.py
index ab4ba92..fae3dd7 100644
--- a/traits-stubs/traits_stubs_tests/util.py
+++ b/traits-stubs/traits_stubs_tests/util.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2020-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2020-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/__init__.py b/traits/__init__.py
index 1006351..55e8346 100644
--- a/traits/__init__.py
+++ b/traits/__init__.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/__init__.py b/traits/adaptation/__init__.py
index d06764e..6646c57 100644
--- a/traits/adaptation/__init__.py
+++ b/traits/adaptation/__init__.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/adaptation_error.py b/traits/adaptation/adaptation_error.py
index 0287eb9..fb1f19d 100644
--- a/traits/adaptation/adaptation_error.py
+++ b/traits/adaptation/adaptation_error.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/adaptation_manager.py b/traits/adaptation/adaptation_manager.py
index c167048..e658a77 100644
--- a/traits/adaptation/adaptation_manager.py
+++ b/traits/adaptation/adaptation_manager.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/adaptation_offer.py b/traits/adaptation/adaptation_offer.py
index 7d507b8..69187e5 100644
--- a/traits/adaptation/adaptation_offer.py
+++ b/traits/adaptation/adaptation_offer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/adapter.py b/traits/adaptation/adapter.py
index 69589e1..fdc5441 100644
--- a/traits/adaptation/adapter.py
+++ b/traits/adaptation/adapter.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/api.py b/traits/adaptation/api.py
index 897f9cc..5a5c369 100644
--- a/traits/adaptation/api.py
+++ b/traits/adaptation/api.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/tests/abc_examples.py b/traits/adaptation/tests/abc_examples.py
index 65baf51..24404b0 100644
--- a/traits/adaptation/tests/abc_examples.py
+++ b/traits/adaptation/tests/abc_examples.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/tests/benchmark.py b/traits/adaptation/tests/benchmark.py
index cc5e63a..ede1336 100644
--- a/traits/adaptation/tests/benchmark.py
+++ b/traits/adaptation/tests/benchmark.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/tests/interface_examples.py b/traits/adaptation/tests/interface_examples.py
index d2f3c2a..0ba44cb 100644
--- a/traits/adaptation/tests/interface_examples.py
+++ b/traits/adaptation/tests/interface_examples.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/tests/lazy_examples.py b/traits/adaptation/tests/lazy_examples.py
index 13ed0fd..819336c 100644
--- a/traits/adaptation/tests/lazy_examples.py
+++ b/traits/adaptation/tests/lazy_examples.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/tests/test_adaptation_manager.py b/traits/adaptation/tests/test_adaptation_manager.py
index 5b78341..55670ce 100644
--- a/traits/adaptation/tests/test_adaptation_manager.py
+++ b/traits/adaptation/tests/test_adaptation_manager.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/tests/test_adaptation_offer.py b/traits/adaptation/tests/test_adaptation_offer.py
index 2fdb0b4..d56c5bc 100644
--- a/traits/adaptation/tests/test_adaptation_offer.py
+++ b/traits/adaptation/tests/test_adaptation_offer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/tests/test_adapter.py b/traits/adaptation/tests/test_adapter.py
index 57e3dab..5124fbd 100644
--- a/traits/adaptation/tests/test_adapter.py
+++ b/traits/adaptation/tests/test_adapter.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/adaptation/tests/test_global_adaptation_manager.py b/traits/adaptation/tests/test_global_adaptation_manager.py
index da151bd..a284454 100644
--- a/traits/adaptation/tests/test_global_adaptation_manager.py
+++ b/traits/adaptation/tests/test_global_adaptation_manager.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/api.py b/traits/api.py
index 92bf7cb..59b2500 100644
--- a/traits/api.py
+++ b/traits/api.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/base_trait_handler.py b/traits/base_trait_handler.py
index eea135c..7d3c048 100644
--- a/traits/base_trait_handler.py
+++ b/traits/base_trait_handler.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/constants.py b/traits/constants.py
index 942bec8..a58cd49 100644
--- a/traits/constants.py
+++ b/traits/constants.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -109,6 +109,9 @@ class ValidateTrait(IntEnum):
     #: A callable check.
     callable = 22
 
+    #: A complex number check.
+    complex_number = 23
+
 
 class ComparisonMode(IntEnum):
     """ Comparison mode.
diff --git a/traits/ctrait.py b/traits/ctrait.py
index eb0bff7..27a9e9d 100644
--- a/traits/ctrait.py
+++ b/traits/ctrait.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -12,7 +12,7 @@
 
 The CTrait class extends the C-level cTrait type to provide the full CTrait
 API. CTraits are the core objects that are used to generate defaults and
-validate as well as maintining a list of notifiers and calling them when
+validate as well as maintaining a list of notifiers and calling them when
 values are modified.
 """
 
diff --git a/traits/ctraits.c b/traits/ctraits.c
index 342e16b..2ee6d40 100644
--- a/traits/ctraits.c
+++ b/traits/ctraits.c
@@ -1,4 +1,4 @@
-// (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+// (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 // All rights reserved.
 //
 // This software is provided without warranty under the terms of the BSD
@@ -1885,13 +1885,11 @@ getattr_generic(trait_object *trait, has_traits_object *obj, PyObject *name)
 static PyObject *
 getattr_event(trait_object *trait, has_traits_object *obj, PyObject *name)
 {
-    PyErr_Format(
+    return PyErr_Format(
         PyExc_AttributeError,
         "The %.400U"
         " trait of a %.50s instance is an 'event', which is write only.",
         name, Py_TYPE(obj)->tp_name);
-
-    return NULL;
 }
 
 /*-----------------------------------------------------------------------------
@@ -2897,7 +2895,7 @@ static trait_setattr setattr_handlers[] = {
     NULL};
 
 
-trait_object *
+PyObject *
 trait_new(PyTypeObject *trait_type, PyObject *args, PyObject *kw)
 {
     int kind = 0;
@@ -2916,15 +2914,14 @@ trait_new(PyTypeObject *trait_type, PyObject *args, PyObject *kw)
         trait = (trait_object *)PyType_GenericNew(trait_type, args, kw);
         trait->getattr = getattr_handlers[kind];
         trait->setattr = setattr_handlers[kind];
-        return trait;
+        return (PyObject *)trait;
     }
 
-    PyErr_Format(
+    return PyErr_Format(
         TraitError,
         "Invalid argument to trait constructor. The argument `kind` "
         "must be an integer between 0 and 8 but a value of %d was provided.",
         kind);
-    return NULL;
 }
 
 /*-----------------------------------------------------------------------------
@@ -3057,11 +3054,26 @@ _trait_set_default_value(trait_object *trait, PyObject *args)
     }
 
     if ((value_type < 0) || (value_type > MAXIMUM_DEFAULT_VALUE_TYPE)) {
-        PyErr_Format(
+        return PyErr_Format(
             PyExc_ValueError,
             "The default value type must be 0..%d, but %d was specified.",
             MAXIMUM_DEFAULT_VALUE_TYPE, value_type);
-        return NULL;
+    }
+
+    /* Validate the value */
+    switch (value_type) {
+        /* We only do sufficient validation to avoid segfaults when
+           unwrapping the value in `default_value_for`. */
+        case CALLABLE_AND_ARGS_DEFAULT_VALUE:
+            if (!PyTuple_Check(value) || PyTuple_GET_SIZE(value) != 3) {
+                PyErr_SetString(
+                    PyExc_ValueError,
+                    "default value for type DefaultValue.callable_and_args "
+                    "must be a tuple of the form (callable, args, kwds)"
+                );
+                return NULL;
+            }
+            break;
     }
 
     trait->default_value_type = value_type;
@@ -3339,7 +3351,7 @@ validate_trait_integer(
 */
 
 static PyObject *
-as_float(PyObject *value)
+validate_float(PyObject *value)
 {
     double value_as_double;
 
@@ -3357,6 +3369,12 @@ as_float(PyObject *value)
     return PyFloat_FromDouble(value_as_double);
 }
 
+static PyObject *
+_ctraits_validate_float(PyObject *self, PyObject *value)
+{
+    return validate_float(value);
+}
+
 /*-----------------------------------------------------------------------------
 |  Verifies that a Python value is convertible to float
 |
@@ -3374,7 +3392,78 @@ validate_trait_float(
     trait_object *trait, has_traits_object *obj, PyObject *name,
     PyObject *value)
 {
-    PyObject *result = as_float(value);
+    PyObject *result = validate_float(value);
+    /* A TypeError represents a type validation failure, and should be
+       re-raised as a TraitError. Other exceptions should be propagated. */
+    if (result == NULL && PyErr_ExceptionMatches(PyExc_TypeError)) {
+        PyErr_Clear();
+        return raise_trait_error(trait, obj, name, value);
+    }
+    return result;
+}
+
+/*
+   Convert a complex-number-like Python object to a complex number.
+
+   Returns a new object of exact type complex, or raises TypeError
+   if the given object cannot be converted to a complex number.
+
+   Here complex-number-like means:
+
+   - is an instance of complex, or
+   - can be converted to a a complex number via its type's __complex__ method,
+     or
+   - can be converted to a float via its type's __float__ method, or
+   - (for Python >= 3.8) can be converted to an int via its type's __index__
+     method.
+
+   In other words, these should be exactly the Python objects that are
+   accepted by the standard functions in the cmath module.
+*/
+
+static PyObject *
+validate_complex_number(PyObject *value)
+{
+    Py_complex value_as_complex;
+
+    /* Fast path for common case. */
+    if (PyComplex_CheckExact(value)) {
+        Py_INCREF(value);
+        return value;
+    }
+
+    /* General case: defer to the machinations of PyComplex_AsCComplex. */
+    value_as_complex = PyComplex_AsCComplex(value);
+    if (value_as_complex.real == -1.0 && PyErr_Occurred()) {
+        return NULL;
+    }
+    return PyComplex_FromCComplex(value_as_complex);
+}
+
+static PyObject *
+_ctraits_validate_complex_number(PyObject *self, PyObject *value)
+{
+    return validate_complex_number(value);
+}
+
+/*-----------------------------------------------------------------------------
+|  Verifies that a Python value is convertible to a complex number.
+|
+|  Will convert anything whose type has a __complex__, __float__ or (for
+|  Python >= 3.8) __index__ method to a Python complex number. Returns a Python
+|  object of exact type "complex". Raises TraitError with a suitable message if
+|  the given value isn't convertible to a complex number.
+|
+|  Any exception other than TypeError raised by any of the special methods
+|  will be propagated. A TypeError will be caught and turned into TraitError.
++----------------------------------------------------------------------------*/
+
+static PyObject *
+validate_trait_complex_number(
+    trait_object *trait, has_traits_object *obj, PyObject *name,
+    PyObject *value)
+{
+    PyObject *result = validate_complex_number(value);
     /* A TypeError represents a type validation failure, and should be
        re-raised as a TraitError. Other exceptions should be propagated. */
     if (result == NULL && PyErr_ExceptionMatches(PyExc_TypeError)) {
@@ -3450,7 +3539,7 @@ validate_trait_float_range(
     PyObject *result;
     int in_range;
 
-    result = as_float(value);
+    result = validate_float(value);
     if (result == NULL) {
         if (PyErr_ExceptionMatches(PyExc_TypeError)) {
             /* Reraise any TypeError as a TraitError. */
@@ -3914,7 +4003,7 @@ validate_trait_complex(
                 break;
 
             case 4: /* Floating point range check: */
-                result = as_float(value);
+                result = validate_float(value);
                 if (result == NULL) {
                     if (PyErr_ExceptionMatches(PyExc_TypeError)) {
                         /* A TypeError should ultimately get re-raised
@@ -4132,7 +4221,7 @@ validate_trait_complex(
                 /* A TypeError indicates that we don't have a match.
                    Clear the error and continue with the next item
                    in the complex sequence. */
-                result = as_float(value);
+                result = validate_float(value);
                 if (result == NULL
                     && PyErr_ExceptionMatches(PyExc_TypeError)) {
                     PyErr_Clear();
@@ -4153,6 +4242,18 @@ validate_trait_complex(
                     break;
                 }
 
+            case 23: /* Complex number check */
+                /* A TypeError indicates that we don't have a match.
+                   Clear the error and continue with the next item
+                   in the complex sequence. */
+                result = validate_complex_number(value);
+                if (result == NULL
+                    && PyErr_ExceptionMatches(PyExc_TypeError)) {
+                    PyErr_Clear();
+                    break;
+                }
+                return result;
+
             default: /* Should never happen...indicates an internal error: */
                 assert(0);  /* invalid validation type */
                 goto error;
@@ -4192,6 +4293,7 @@ static trait_validate validate_handlers[] = {
     validate_trait_integer, /* case 20: Integer check */
     validate_trait_float,   /* case 21: Float check */
     validate_trait_callable,   /* case 22: Callable check */
+    validate_trait_complex_number,  /* case 23: Complex number check */
 };
 
 static PyObject *
@@ -4351,6 +4453,12 @@ _trait_set_validate(trait_object *trait, PyObject *args)
                         goto done;
                     }
                     break;
+
+                case 23: /* Complex check: */
+                    if (n == 1) {
+                        goto done;
+                    }
+                    break;
             }
         }
     }
@@ -5484,7 +5592,7 @@ static PyTypeObject trait_type = {
     sizeof(trait_object) - sizeof(PyObject *), /* tp_dictoffset */
     0,                                         /* tp_init */
     0,                                         /* tp_alloc */
-    (newfunc)trait_new                         /* tp_new */
+    trait_new                                  /* tp_new */
 };
 
 /*-----------------------------------------------------------------------------
@@ -5547,6 +5655,22 @@ _ctraits_ctrait(PyObject *self, PyObject *args)
 |  'CTrait' instance methods:
 +----------------------------------------------------------------------------*/
 
+PyDoc_STRVAR(
+    _ctraits_validate_float_doc,
+    "_validate_float(number)\n"
+    "\n"
+    "Return *number* converted to a float. Raise TypeError if \n"
+    "conversion is not possible.\n"
+);
+
+PyDoc_STRVAR(
+    _ctraits_validate_complex_number_doc,
+    "_validate_complex_number(number)\n"
+    "\n"
+    "Return *number* converted to a complex number. Raise TypeError if \n"
+    "conversion is not possible.\n"
+);
+
 static PyMethodDef ctraits_methods[] = {
     {"_list_classes", (PyCFunction)_ctraits_list_classes, METH_VARARGS,
      PyDoc_STR(
@@ -5555,6 +5679,10 @@ static PyMethodDef ctraits_methods[] = {
      PyDoc_STR("_adapt(adaptation_function)")},
     {"_ctrait", (PyCFunction)_ctraits_ctrait, METH_VARARGS,
      PyDoc_STR("_ctrait(CTrait_class)")},
+    {"_validate_float", (PyCFunction)_ctraits_validate_float, METH_O,
+     _ctraits_validate_float_doc},
+    {"_validate_complex_number", (PyCFunction)_ctraits_validate_complex_number,
+     METH_O, _ctraits_validate_complex_number_doc},
     {NULL, NULL},
 };
 
diff --git a/traits/editor_factories.py b/traits/editor_factories.py
index b4c57f2..ae1d927 100644
--- a/traits/editor_factories.py
+++ b/traits/editor_factories.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/etsconfig/__init__.py b/traits/etsconfig/__init__.py
index aed5727..37f1d31 100644
--- a/traits/etsconfig/__init__.py
+++ b/traits/etsconfig/__init__.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/etsconfig/api.py b/traits/etsconfig/api.py
index ce825f7..a104e6d 100644
--- a/traits/etsconfig/api.py
+++ b/traits/etsconfig/api.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/etsconfig/etsconfig.py b/traits/etsconfig/etsconfig.py
index 341138e..a9fbe52 100644
--- a/traits/etsconfig/etsconfig.py
+++ b/traits/etsconfig/etsconfig.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -12,10 +12,9 @@
 
 
 # Standard library imports.
-import sys
+import contextlib
 import os
-from os import path
-from contextlib import contextmanager
+import sys
 
 
 class ETSToolkitError(RuntimeError):
@@ -42,14 +41,20 @@ class ETSToolkitError(RuntimeError):
         self.args = args
 
 
-class ETSConfig(object):
+class ETSConfigType:
     """
     Enthought Tool Suite configuration information.
 
-    This class should not use ANY other package in the tool suite so that it
-    will always work no matter which other packages are present.
+    Instances of this class record state useful for ETS-using applications,
+    including the current GUI toolkit in use, and data and home directory
+    setttings.
 
+    Users typically shouldn't make use of this class directly. Instead, use the
+    module-level :data:`~.ETSConfig` instance of this class, which is shared
+    between the various ETS packages.
     """
+    # This class should not use ANY other package in the tool suite so that it
+    # will always work no matter which other packages are present.
 
     ###########################################################################
     # 'object' interface.
@@ -94,7 +99,7 @@ class ETSConfig(object):
 
             - The actual location differs between operating systems.
 
-       """
+        """
         if self._application_data is None:
             self._application_data = self._initialize_application_data(
                 create=create
@@ -117,6 +122,10 @@ class ETSConfig(object):
 
         self._application_data = application_data
 
+    @application_data.deleter
+    def application_data(self):
+        self._application_data = None
+
     def get_application_home(self, create=False):
         """ Return the application home directory path.
 
@@ -151,9 +160,9 @@ class ETSConfig(object):
 
             - The actual location differs between operating systems.
 
-       """
+        """
         if self._application_home is None:
-            self._application_home = path.join(
+            self._application_home = os.path.join(
                 self.get_application_data(create=create),
                 self._get_application_dirname(),
             )
@@ -175,6 +184,10 @@ class ETSConfig(object):
 
         self._application_home = application_home
 
+    @application_home.deleter
+    def application_home(self):
+        self._application_home = None
+
     @property
     def company(self):
         """
@@ -196,7 +209,11 @@ class ETSConfig(object):
 
         self._company = company
 
-    @contextmanager
+    @company.deleter
+    def company(self):
+        self._company = None
+
+    @contextlib.contextmanager
     def provisional_toolkit(self, toolkit):
         """ Perform an operation with toolkit provisionally set
 
@@ -260,6 +277,10 @@ class ETSConfig(object):
 
         self._toolkit = toolkit
 
+    @toolkit.deleter
+    def toolkit(self):
+        self._toolkit = None
+
     @property
     def enable_toolkit(self):
         """
@@ -306,21 +327,12 @@ class ETSConfig(object):
                 "which has not been set."
             )
 
-        if self._kiva_backend is None:
-            try:
-                self._kiva_backend = self._toolkit.split(".")[1]
-            except IndexError:
-                # Pick a reasonable default based on the toolkit
-                if self.toolkit == "wx":
-                    self._kiva_backend = (
-                        "quartz" if sys.platform == "darwin" else "image"
-                    )
-                elif self.toolkit in ["qt4", "qt"]:
-                    self._kiva_backend = "image"
-                else:
-                    self._kiva_backend = "image"
-
-        return self._kiva_backend
+        if "." in self._toolkit:
+            return self._toolkit.split(".")[1]
+        elif self.toolkit == "wx" and sys.platform == "darwin":
+            return "quartz"
+        else:
+            return "image"
 
     @property
     def user_data(self):
@@ -348,6 +360,10 @@ class ETSConfig(object):
 
         self._user_data = user_data
 
+    @user_data.deleter
+    def user_data(self):
+        self._user_data = None
+
     #### private methods #####################################################
 
     # fixme: In future, these methods could allow the properties to be set
@@ -377,8 +393,8 @@ class ETSConfig(object):
         main_mod = sys.modules.get("__main__", None)
         if main_mod is not None:
             if hasattr(main_mod, "__file__"):
-                main_mod_file = path.abspath(main_mod.__file__)
-                dirname = path.basename(path.dirname(main_mod_file))
+                main_mod_file = os.path.abspath(main_mod.__file__)
+                dirname = os.path.basename(os.path.dirname(main_mod_file))
 
         return dirname
 
@@ -501,7 +517,10 @@ class ETSConfig(object):
         return usr_dir
 
 
-# We very purposefully only have one object and do not export the class. We
-# could have just made everything class methods, but that always seems a bit
-# gorpy, especially with properties etc.
-ETSConfig = ETSConfig()
+#: This single instance of :class:`~.ETSConfigType` is shared between the
+#: various ETS packages, and used to store global state relevant to
+#: ETS-using applications.
+#:
+#: See https://github.com/enthought/traits/discussions/1666 for a discussion
+#: of writing tests that depend on :data:`~.ETSConfig` state.
+ETSConfig = ETSConfigType()
diff --git a/traits/etsconfig/tests/test_etsconfig.py b/traits/etsconfig/tests/test_etsconfig.py
index 50a5b5d..8985eb3 100644
--- a/traits/etsconfig/tests/test_etsconfig.py
+++ b/traits/etsconfig/tests/test_etsconfig.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -13,12 +13,13 @@
 # Standard library imports.
 import contextlib
 import os
+import pathlib
 import shutil
 import sys
 import tempfile
 import time
-
 import unittest
+from unittest.mock import patch
 
 # Enthought library imports.
 from traits.etsconfig.etsconfig import ETSConfig, ETSToolkitError
@@ -69,7 +70,7 @@ def temporary_home_directory():
     with temporary_directory() as temp_home:
         with restore_mapping_entry(os.environ, home_var):
             os.environ[home_var] = temp_home
-            yield
+            yield temp_home
 
 
 @contextlib.contextmanager
@@ -109,11 +110,9 @@ class ETSConfigTestCase(unittest.TestCase):
 
         # Make a fresh instance each time.
         self.ETSConfig = type(ETSConfig)()
-
-    def run(self, result=None):
-        # Extend TestCase.run to use a temporary home directory.
-        with temporary_home_directory():
-            super().run(result)
+        with contextlib.ExitStack() as stack:
+            self._temp_home = stack.enter_context(temporary_home_directory())
+            self.addCleanup(stack.pop_all().close)
 
     ###########################################################################
     # 'ETSConfigTestCase' interface.
@@ -146,6 +145,27 @@ class ETSConfigTestCase(unittest.TestCase):
         self.ETSConfig.application_data = old
         self.assertEqual(old, self.ETSConfig.application_data)
 
+    def test_delete_application_data(self):
+        default_application_data = self.ETSConfig.application_data
+        self.ETSConfig.application_data = "SomeOtherPath"
+        del self.ETSConfig.application_data
+        self.assertEqual(
+            self.ETSConfig.application_data,
+            default_application_data,
+        )
+
+    def test_mock_application_data(self):
+        # given
+        old_app_data = self.ETSConfig.application_data
+
+        # when
+        with patch.object(self.ETSConfig, "application_data", new="foo"):
+            # then
+            self.assertEqual(self.ETSConfig.application_data, "foo")
+
+        # then
+        self.assertEqual(self.ETSConfig.application_data, old_app_data)
+
     def test_application_data_is_idempotent(self):
         """
         application data is idempotent
@@ -202,20 +222,63 @@ class ETSConfigTestCase(unittest.TestCase):
         self.ETSConfig.company = old
         self.assertEqual(old, self.ETSConfig.company)
 
-    def _test_default_application_home(self):
+    def test_delete_company(self):
+        default_company = self.ETSConfig.company
+        self.ETSConfig.company = "ImaginaryCo"
+        # Deletion restores the default
+        del self.ETSConfig.company
+        self.assertEqual(self.ETSConfig.company, default_company)
+
+    def test_mock_company(self):
+        # given
+        old_company = self.ETSConfig.company
+
+        # when
+        with patch.object(self.ETSConfig, "company", new="new company"):
+            # then
+            self.assertEqual(self.ETSConfig.company, "new company")
+
+        # then
+        self.assertEqual(self.ETSConfig.company, old_company)
+
+    def test_default_application_home(self):
         """
         application home
 
         """
-
-        # This test is only valid when run with the 'main' at the end of this
-        # file: "python app_dat_locator_test_case.py", in which case the
-        # app_name will be the directory this file is in ('tests').
         app_home = self.ETSConfig.application_home
         (dirname, app_name) = os.path.split(app_home)
 
         self.assertEqual(dirname, self.ETSConfig.application_data)
-        self.assertEqual(app_name, "tests")
+        self.assertEqual(
+            app_name,
+            pathlib.Path(sys.modules["__main__"].__file__).parts[-2]
+        )
+
+    def test_delete_application_home(self):
+        # given
+        default_application_home = self.ETSConfig.application_home
+        self.ETSConfig.application_home = "dummy"
+        self.assertEqual(self.ETSConfig.application_home, "dummy")
+
+        # check that the property can be deleted
+        del self.ETSConfig.application_home
+        self.assertEqual(
+            self.ETSConfig.application_home,
+            default_application_home,
+        )
+
+    def test_mock_application_home(self):
+        # given
+        old_app_home = self.ETSConfig.application_home
+
+        # when
+        with patch.object(self.ETSConfig, "application_home", new="foo"):
+            # then
+            self.assertEqual(self.ETSConfig.application_home, "foo")
+
+        # then
+        self.assertEqual(self.ETSConfig.application_home, old_app_home)
 
     def test_toolkit_default_kiva_backend(self):
         self.ETSConfig.toolkit = "qt4"
@@ -229,6 +292,20 @@ class ETSConfigTestCase(unittest.TestCase):
         self.ETSConfig.toolkit = "wx.celiagg"
         self.assertEqual(self.ETSConfig.kiva_backend, "celiagg")
 
+    def test_toolkit_kiva_backend_changes_when_toolkit_changed(self):
+        self.ETSConfig.toolkit = "wx.celiagg"
+        self.assertEqual(self.ETSConfig.kiva_backend, "celiagg")
+        del self.ETSConfig.toolkit
+
+        self.ETSConfig.toolkit = "wx.quartz"
+        self.assertEqual(self.ETSConfig.kiva_backend, "quartz")
+
+    def test_mock_kiva_backend(self):
+        # when
+        with patch.object(self.ETSConfig, "toolkit", new="test.foo"):
+            # then
+            self.assertEqual(self.ETSConfig.kiva_backend, "foo")
+
     def test_toolkit_environ(self):
         test_args = ["something"]
         test_environ = {"ETS_TOOLKIT": "test"}
@@ -258,6 +335,23 @@ class ETSConfigTestCase(unittest.TestCase):
 
         self.assertEqual(toolkit, "test_direct")
 
+    def test_delete_toolkit(self):
+        default_toolkit = self.ETSConfig.toolkit
+        del self.ETSConfig.toolkit
+        self.assertEqual(self.ETSConfig.toolkit, default_toolkit)
+
+    def test_mock_toolkit(self):
+        # given
+        old_toolkit = self.ETSConfig.toolkit
+
+        # when
+        with patch.object(self.ETSConfig, "toolkit", new="foo"):
+            # then
+            self.assertEqual(self.ETSConfig.toolkit, "foo")
+
+        # then
+        self.assertEqual(self.ETSConfig.toolkit, old_toolkit)
+
     def test_provisional_toolkit(self):
         test_args = []
         test_environ = {}
@@ -331,6 +425,24 @@ class ETSConfigTestCase(unittest.TestCase):
         self.ETSConfig.user_data = old
         self.assertEqual(old, self.ETSConfig.user_data)
 
+    def test_delete_user_data(self):
+        default_user_data = self.ETSConfig.user_data
+        self.ETSConfig.user_data = "SomeOtherPath"
+        del self.ETSConfig.user_data
+        self.assertEqual(self.ETSConfig.user_data, default_user_data)
+
+    def test_mock_user_data(self):
+        # given
+        old_user_data = self.ETSConfig.user_data
+
+        # when
+        with patch.object(self.ETSConfig, "user_data", new="foo"):
+            # then
+            self.assertEqual(self.ETSConfig.user_data, "foo")
+
+        # then
+        self.assertEqual(self.ETSConfig.user_data, old_user_data)
+
     def test_user_data_is_idempotent(self):
         """
         user data is idempotent
@@ -363,14 +475,3 @@ class ETSConfigTestCase(unittest.TestCase):
         os.remove(path)
 
         self.assertEqual(data, result)
-
-
-# For running as an individual set of tests.
-if __name__ == "__main__":
-
-    # Add the non-default test of application_home...non-default because it
-    # must be run using this module as a script to be valid.
-    suite = unittest.TestLoader().loadTestsFromTestCase(ETSConfigTestCase)
-    suite.addTest(ETSConfigTestCase("_test_default_application_home"))
-
-    unittest.TextTestRunner(verbosity=2).run(suite)
diff --git a/traits/examples/__init__.py b/traits/examples/__init__.py
index 26ce110..20ef4fa 100644
--- a/traits/examples/__init__.py
+++ b/traits/examples/__init__.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/examples/_etsdemo_info.py b/traits/examples/_etsdemo_info.py
index 826e62a..0e45019 100644
--- a/traits/examples/_etsdemo_info.py
+++ b/traits/examples/_etsdemo_info.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/examples/introduction/0_introduction.py b/traits/examples/introduction/0_introduction.py
index a14a0e8..ba2a45d 100644
--- a/traits/examples/introduction/0_introduction.py
+++ b/traits/examples/introduction/0_introduction.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/examples/introduction/1_validation.py b/traits/examples/introduction/1_validation.py
index 3b7220c..f1d5386 100644
--- a/traits/examples/introduction/1_validation.py
+++ b/traits/examples/introduction/1_validation.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/examples/introduction/2_initialization.py b/traits/examples/introduction/2_initialization.py
index f74fad8..b90102d 100644
--- a/traits/examples/introduction/2_initialization.py
+++ b/traits/examples/introduction/2_initialization.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/examples/introduction/3_observation.py b/traits/examples/introduction/3_observation.py
index 1102a73..c817742 100644
--- a/traits/examples/introduction/3_observation.py
+++ b/traits/examples/introduction/3_observation.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/examples/introduction/4_properties.py b/traits/examples/introduction/4_properties.py
index 6e4da57..ddb3d96 100644
--- a/traits/examples/introduction/4_properties.py
+++ b/traits/examples/introduction/4_properties.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/examples/introduction/5_documentation.py b/traits/examples/introduction/5_documentation.py
index f4b177a..491914a 100644
--- a/traits/examples/introduction/5_documentation.py
+++ b/traits/examples/introduction/5_documentation.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/examples/introduction/6_visualization.py b/traits/examples/introduction/6_visualization.py
index 54cf400..51c05fd 100644
--- a/traits/examples/introduction/6_visualization.py
+++ b/traits/examples/introduction/6_visualization.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/examples/tests/test_etsdemo_info.py b/traits/examples/tests/test_etsdemo_info.py
index 0ed8b72..f7a3a5a 100644
--- a/traits/examples/tests/test_etsdemo_info.py
+++ b/traits/examples/tests/test_etsdemo_info.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/has_traits.py b/traits/has_traits.py
index 108fff6..e8e3222 100644
--- a/traits/has_traits.py
+++ b/traits/has_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -586,17 +586,7 @@ def update_traits_class_dict(class_name, bases, class_dict):
                             % (ictrait.type, name)
                         )
 
-                    default_value = value
-                    class_traits[name] = value = ictrait(default_value)
-                    # Make sure that the trait now has the default value
-                    # has the correct initializer.
-                    if value.setattr_original_value:
-                        # Set the original, non validated value
-                        value.set_default_value(
-                            DefaultValue.missing, default_value)
-                    else:
-                        value.set_default_value(
-                            DefaultValue.missing, value.default)
+                    class_traits[name] = ictrait(value)
                     del class_dict[name]
                     break
 
diff --git a/traits/interface_checker.py b/traits/interface_checker.py
index fe610a7..5731f7b 100644
--- a/traits/interface_checker.py
+++ b/traits/interface_checker.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_anytrait_filter.py b/traits/observation/_anytrait_filter.py
index 7ca5234..e5b07c1 100644
--- a/traits/observation/_anytrait_filter.py
+++ b/traits/observation/_anytrait_filter.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_dict_change_event.py b/traits/observation/_dict_change_event.py
index 98cd259..ad00403 100644
--- a/traits/observation/_dict_change_event.py
+++ b/traits/observation/_dict_change_event.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_dict_item_observer.py b/traits/observation/_dict_item_observer.py
index edb87c8..ea7befc 100644
--- a/traits/observation/_dict_item_observer.py
+++ b/traits/observation/_dict_item_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_filtered_trait_observer.py b/traits/observation/_filtered_trait_observer.py
index 03e2224..f02acab 100644
--- a/traits/observation/_filtered_trait_observer.py
+++ b/traits/observation/_filtered_trait_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_has_traits_helpers.py b/traits/observation/_has_traits_helpers.py
index 567def4..f38e8bc 100644
--- a/traits/observation/_has_traits_helpers.py
+++ b/traits/observation/_has_traits_helpers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_i_notifier.py b/traits/observation/_i_notifier.py
index 2b28ed8..5d7ca07 100644
--- a/traits/observation/_i_notifier.py
+++ b/traits/observation/_i_notifier.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_i_observer.py b/traits/observation/_i_observer.py
index 9643680..3a21c41 100644
--- a/traits/observation/_i_observer.py
+++ b/traits/observation/_i_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_list_change_event.py b/traits/observation/_list_change_event.py
index eb77175..5649439 100644
--- a/traits/observation/_list_change_event.py
+++ b/traits/observation/_list_change_event.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_list_item_observer.py b/traits/observation/_list_item_observer.py
index 0a25029..2feeba2 100644
--- a/traits/observation/_list_item_observer.py
+++ b/traits/observation/_list_item_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_metadata_filter.py b/traits/observation/_metadata_filter.py
index 3d040d4..dc52295 100644
--- a/traits/observation/_metadata_filter.py
+++ b/traits/observation/_metadata_filter.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_named_trait_observer.py b/traits/observation/_named_trait_observer.py
index 8913b35..ea4274d 100644
--- a/traits/observation/_named_trait_observer.py
+++ b/traits/observation/_named_trait_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_observe.py b/traits/observation/_observe.py
index a2edcda..2516eca 100644
--- a/traits/observation/_observe.py
+++ b/traits/observation/_observe.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_observer_change_notifier.py b/traits/observation/_observer_change_notifier.py
index 92863d3..5fedf4e 100644
--- a/traits/observation/_observer_change_notifier.py
+++ b/traits/observation/_observer_change_notifier.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -153,7 +153,7 @@ class ObserverChangeNotifier:
         )
 
     def equals(self, other):
-        """ Return true if the other value is a notifier equivalent to this one.
+        """ Return true if other is a notifier equivalent to this one.
 
         Parameters
         ----------
diff --git a/traits/observation/_observer_graph.py b/traits/observation/_observer_graph.py
index fb491a7..d6e15d3 100644
--- a/traits/observation/_observer_graph.py
+++ b/traits/observation/_observer_graph.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_set_change_event.py b/traits/observation/_set_change_event.py
index 667adcb..4c332e3 100644
--- a/traits/observation/_set_change_event.py
+++ b/traits/observation/_set_change_event.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_set_item_observer.py b/traits/observation/_set_item_observer.py
index b987597..808439f 100644
--- a/traits/observation/_set_item_observer.py
+++ b/traits/observation/_set_item_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_testing.py b/traits/observation/_testing.py
index a446c7a..098e3ee 100644
--- a/traits/observation/_testing.py
+++ b/traits/observation/_testing.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_trait_added_observer.py b/traits/observation/_trait_added_observer.py
index 7733156..d3a88be 100644
--- a/traits/observation/_trait_added_observer.py
+++ b/traits/observation/_trait_added_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_trait_change_event.py b/traits/observation/_trait_change_event.py
index 22bc058..53681df 100644
--- a/traits/observation/_trait_change_event.py
+++ b/traits/observation/_trait_change_event.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/_trait_event_notifier.py b/traits/observation/_trait_event_notifier.py
index 81f00db..e8ab706 100644
--- a/traits/observation/_trait_event_notifier.py
+++ b/traits/observation/_trait_event_notifier.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/api.py b/traits/observation/api.py
index cc63621..5c0fdf7 100644
--- a/traits/observation/api.py
+++ b/traits/observation/api.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/events.py b/traits/observation/events.py
index fd067b6..574fb8e 100644
--- a/traits/observation/events.py
+++ b/traits/observation/events.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/exception_handling.py b/traits/observation/exception_handling.py
index cdc13d1..0bc1978 100644
--- a/traits/observation/exception_handling.py
+++ b/traits/observation/exception_handling.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -91,7 +91,7 @@ class ObserverExceptionHandlerStack:
         return self.handlers.pop()
 
     def handle_exception(self, event):
-        """ Handles a traits notification exception using the handler last pushed.
+        """ Handle a notification exception using the handler last pushed.
 
         Parameters
         ----------
diff --git a/traits/observation/exceptions.py b/traits/observation/exceptions.py
index de5a718..5e57b71 100644
--- a/traits/observation/exceptions.py
+++ b/traits/observation/exceptions.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/expression.py b/traits/observation/expression.py
index b11f8bf..a7881e0 100644
--- a/traits/observation/expression.py
+++ b/traits/observation/expression.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/i_observable.py b/traits/observation/i_observable.py
index f284b75..64b8a78 100644
--- a/traits/observation/i_observable.py
+++ b/traits/observation/i_observable.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/observe.py b/traits/observation/observe.py
index 83447a4..3dabec9 100644
--- a/traits/observation/observe.py
+++ b/traits/observation/observe.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/parsing.py b/traits/observation/parsing.py
index 484ee41..e973934 100644
--- a/traits/observation/parsing.py
+++ b/traits/observation/parsing.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -197,7 +197,7 @@ def parse(text):
 
 @lru_cache(maxsize=expression_module._OBSERVER_EXPRESSION_CACHE_MAXSIZE)
 def compile_str(text):
-    """ Compile a mini-language string to a list of ObserverGraphs.
+    """ Compile a mini-language string to a list of ObserverGraph objects.
 
     Parameters
     ----------
diff --git a/traits/observation/tests/test_dict_change_event.py b/traits/observation/tests/test_dict_change_event.py
index 661d97b..68025d2 100644
--- a/traits/observation/tests/test_dict_change_event.py
+++ b/traits/observation/tests/test_dict_change_event.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_dict_item_observer.py b/traits/observation/tests/test_dict_item_observer.py
index 923da83..4e580e2 100644
--- a/traits/observation/tests/test_dict_item_observer.py
+++ b/traits/observation/tests/test_dict_item_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_exception_handling.py b/traits/observation/tests/test_exception_handling.py
index e1d7c5e..31c4d59 100644
--- a/traits/observation/tests/test_exception_handling.py
+++ b/traits/observation/tests/test_exception_handling.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_expression.py b/traits/observation/tests/test_expression.py
index 74ec9e6..bc7c182 100644
--- a/traits/observation/tests/test_expression.py
+++ b/traits/observation/tests/test_expression.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_filtered_trait_observer.py b/traits/observation/tests/test_filtered_trait_observer.py
index 434f668..570df27 100644
--- a/traits/observation/tests/test_filtered_trait_observer.py
+++ b/traits/observation/tests/test_filtered_trait_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_generated_parser.py b/traits/observation/tests/test_generated_parser.py
index a636097..4b265b4 100644
--- a/traits/observation/tests/test_generated_parser.py
+++ b/traits/observation/tests/test_generated_parser.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_has_traits_helpers.py b/traits/observation/tests/test_has_traits_helpers.py
index 2b3451d..1e97566 100644
--- a/traits/observation/tests/test_has_traits_helpers.py
+++ b/traits/observation/tests/test_has_traits_helpers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_list_change_event.py b/traits/observation/tests/test_list_change_event.py
index ebe018b..b776e48 100644
--- a/traits/observation/tests/test_list_change_event.py
+++ b/traits/observation/tests/test_list_change_event.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_list_item_observer.py b/traits/observation/tests/test_list_item_observer.py
index 4eaa442..014c5a4 100644
--- a/traits/observation/tests/test_list_item_observer.py
+++ b/traits/observation/tests/test_list_item_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_metadata_filter.py b/traits/observation/tests/test_metadata_filter.py
index 2d30256..650ab1d 100644
--- a/traits/observation/tests/test_metadata_filter.py
+++ b/traits/observation/tests/test_metadata_filter.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_named_trait_observer.py b/traits/observation/tests/test_named_trait_observer.py
index 7465cd0..ff89e4b 100644
--- a/traits/observation/tests/test_named_trait_observer.py
+++ b/traits/observation/tests/test_named_trait_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_observe.py b/traits/observation/tests/test_observe.py
index a5d9675..0627947 100644
--- a/traits/observation/tests/test_observe.py
+++ b/traits/observation/tests/test_observe.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_observer_change_notifier.py b/traits/observation/tests/test_observer_change_notifier.py
index eda55ad..6413a3e 100644
--- a/traits/observation/tests/test_observer_change_notifier.py
+++ b/traits/observation/tests/test_observer_change_notifier.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_observer_graph.py b/traits/observation/tests/test_observer_graph.py
index 256bc09..861cfe0 100644
--- a/traits/observation/tests/test_observer_graph.py
+++ b/traits/observation/tests/test_observer_graph.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_parsing.py b/traits/observation/tests/test_parsing.py
index b0492df..b78eff7 100644
--- a/traits/observation/tests/test_parsing.py
+++ b/traits/observation/tests/test_parsing.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_set_change_event.py b/traits/observation/tests/test_set_change_event.py
index 620d4a3..167cd65 100644
--- a/traits/observation/tests/test_set_change_event.py
+++ b/traits/observation/tests/test_set_change_event.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_set_item_observer.py b/traits/observation/tests/test_set_item_observer.py
index 32371f0..45414a5 100644
--- a/traits/observation/tests/test_set_item_observer.py
+++ b/traits/observation/tests/test_set_item_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_trait_added_observer.py b/traits/observation/tests/test_trait_added_observer.py
index 7b32736..122372d 100644
--- a/traits/observation/tests/test_trait_added_observer.py
+++ b/traits/observation/tests/test_trait_added_observer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_trait_change_event.py b/traits/observation/tests/test_trait_change_event.py
index 1b06444..3136bb2 100644
--- a/traits/observation/tests/test_trait_change_event.py
+++ b/traits/observation/tests/test_trait_change_event.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/observation/tests/test_trait_event_notifier.py b/traits/observation/tests/test_trait_event_notifier.py
index b4ac3ba..640681e 100644
--- a/traits/observation/tests/test_trait_event_notifier.py
+++ b/traits/observation/tests/test_trait_event_notifier.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/testing/__init__.py b/traits/testing/__init__.py
index 829135e..d9892dd 100644
--- a/traits/testing/__init__.py
+++ b/traits/testing/__init__.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/testing/api.py b/traits/testing/api.py
index d615c2b..6852166 100644
--- a/traits/testing/api.py
+++ b/traits/testing/api.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/testing/doctest_tools.py b/traits/testing/doctest_tools.py
index b035a28..888a838 100644
--- a/traits/testing/doctest_tools.py
+++ b/traits/testing/doctest_tools.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/testing/nose_tools.py b/traits/testing/nose_tools.py
index 70f6c09..04dca71 100644
--- a/traits/testing/nose_tools.py
+++ b/traits/testing/nose_tools.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/testing/optional_dependencies.py b/traits/testing/optional_dependencies.py
index 3f59c47..acda7c1 100644
--- a/traits/testing/optional_dependencies.py
+++ b/traits/testing/optional_dependencies.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -45,6 +45,10 @@ requires_mypy = unittest.skipIf(mypy is None, "Mypy not available")
 numpy = optional_import("numpy")
 requires_numpy = unittest.skipIf(numpy is None, "NumPy not available")
 
+numpy_typing = optional_import("numpy.typing")
+requires_numpy_typing = unittest.skipIf(
+    numpy_typing is None, "numpy.typing not available")
+
 pkg_resources = optional_import("pkg_resources")
 requires_pkg_resources = unittest.skipIf(
     pkg_resources is None, "pkg_resources not available"
diff --git a/traits/testing/tests/test_nose_tools.py b/traits/testing/tests/test_nose_tools.py
index cef74a0..620c0f7 100644
--- a/traits/testing/tests/test_nose_tools.py
+++ b/traits/testing/tests/test_nose_tools.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/testing/tests/test_optional_dependencies.py b/traits/testing/tests/test_optional_dependencies.py
index 447ec83..dd7c823 100644
--- a/traits/testing/tests/test_optional_dependencies.py
+++ b/traits/testing/tests/test_optional_dependencies.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/testing/tests/test_unittest_tools.py b/traits/testing/tests/test_unittest_tools.py
index 0c270cf..f013f3e 100644
--- a/traits/testing/tests/test_unittest_tools.py
+++ b/traits/testing/tests/test_unittest_tools.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -38,7 +38,7 @@ def old_and_dull():
     pass
 
 
-class TestObject(HasTraits):
+class ExampleObject(HasTraits):
 
     number = Float(2.0)
     list_of_numbers = List(Float)
@@ -54,7 +54,7 @@ class TestObject(HasTraits):
 
 class UnittestToolsTestCase(unittest.TestCase, UnittestTools):
     def setUp(self):
-        self.test_object = TestObject()
+        self.test_object = ExampleObject()
 
     def test_when_using_with(self):
         """ Check normal use cases as a context manager.
@@ -224,7 +224,7 @@ class UnittestToolsTestCase(unittest.TestCase, UnittestTools):
         """ Make sure that the traits context manager does not stop
         regular assertions inside the managed code block from happening.
         """
-        test_object = TestObject(number=16.0)
+        test_object = ExampleObject(number=16.0)
 
         with self.assertTraitDoesNotChange(test_object, "number"):
             self.assertEqual(test_object.number, 16.0)
@@ -236,7 +236,7 @@ class UnittestToolsTestCase(unittest.TestCase, UnittestTools):
     def test_special_case_for_count(self):
         """ Count equal to 0 should be valid but it is discouraged.
         """
-        test_object = TestObject(number=16.0)
+        test_object = ExampleObject(number=16.0)
 
         with self.assertTraitChanges(test_object, "number", count=0):
             test_object.flag = True
diff --git a/traits/testing/unittest_tools.py b/traits/testing/unittest_tools.py
index ff3aa6e..d1a40a5 100644
--- a/traits/testing/unittest_tools.py
+++ b/traits/testing/unittest_tools.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/__init__.py b/traits/tests/__init__.py
index 8a75268..3580eb4 100644
--- a/traits/tests/__init__.py
+++ b/traits/tests/__init__.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/check_observe_timing.py b/traits/tests/check_observe_timing.py
index eb2df97..9fada98 100644
--- a/traits/tests/check_observe_timing.py
+++ b/traits/tests/check_observe_timing.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -276,7 +276,7 @@ def get_property_simple_timing(property_args, cached_property):
     """ Time the cases described by the (cached) property depending on a simple
     trait scenario.  Whether or not the property is cached is based on the
     cached_property argument, and the given property_args argument is used in
-    the Property trait defintion.
+    the Property trait definition.
 
     Parameters
     ----------
@@ -373,7 +373,7 @@ def get_property_extended_timing(property_args, cached_property):
     """ Time the cases described by the (cached) property depending on an
     extended trait scenario. Wether or not the property is cached is determined
     by the cached_property argument, and the given property_args argument is
-    used for the Property trait defintion.
+    used for the Property trait definition.
 
     Parameters
     ----------
diff --git a/traits/tests/check_timing.py b/traits/tests/check_timing.py
index 57d2e8d..9c9f66b 100644
--- a/traits/tests/check_timing.py
+++ b/traits/tests/check_timing.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test-data/historical-pickles/generate_pickles.py b/traits/tests/test-data/historical-pickles/generate_pickles.py
index 0a8d694..59745ba 100644
--- a/traits/tests/test-data/historical-pickles/generate_pickles.py
+++ b/traits/tests/test-data/historical-pickles/generate_pickles.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_abc.py b/traits/tests/test_abc.py
index 239c230..d096822 100644
--- a/traits/tests/test_abc.py
+++ b/traits/tests/test_abc.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_any.py b/traits/tests/test_any.py
index 8e5813b..05be94d 100644
--- a/traits/tests/test_any.py
+++ b/traits/tests/test_any.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_anytrait_static_notifiers.py b/traits/tests/test_anytrait_static_notifiers.py
index 73b5110..1cad2cc 100644
--- a/traits/tests/test_anytrait_static_notifiers.py
+++ b/traits/tests/test_anytrait_static_notifiers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_array.py b/traits/tests/test_array.py
index e8f849d..fa56d75 100644
--- a/traits/tests/test_array.py
+++ b/traits/tests/test_array.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_array_or_none.py b/traits/tests/test_array_or_none.py
index 4775aba..883779c 100644
--- a/traits/tests/test_array_or_none.py
+++ b/traits/tests/test_array_or_none.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_automatic_adaptation.py b/traits/tests/test_automatic_adaptation.py
index 2fe3e91..08bf552 100644
--- a/traits/tests/test_automatic_adaptation.py
+++ b/traits/tests/test_automatic_adaptation.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -38,7 +38,7 @@ def default_foo():
     return Foo(default=True)
 
 
-class TestAutomaticAdaptationBase:
+class AutomaticAdaptationTestMixin:
     """
     Mixin for tests to be applied to both Instance and BaseInstance.
 
@@ -128,7 +128,7 @@ class TestAutomaticAdaptationBase:
 
 
 class TestAutomaticAdaptationInstance(
-    TestAutomaticAdaptationBase, unittest.TestCase
+    AutomaticAdaptationTestMixin, unittest.TestCase
 ):
     """
     Tests for automatic adaptation with Instance.
@@ -139,7 +139,7 @@ class TestAutomaticAdaptationInstance(
 
 
 class TestAutomaticAdaptationBaseInstance(
-    TestAutomaticAdaptationBase, unittest.TestCase
+    AutomaticAdaptationTestMixin, unittest.TestCase
 ):
     """
     Tests for automatic adaptation with BaseInstance.
diff --git a/traits/tests/test_bool.py b/traits/tests/test_bool.py
index 1d3a7e5..f9033ac 100644
--- a/traits/tests/test_bool.py
+++ b/traits/tests/test_bool.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_callable.py b/traits/tests/test_callable.py
index f8922d8..e13d09a 100644
--- a/traits/tests/test_callable.py
+++ b/traits/tests/test_callable.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_class_traits.py b/traits/tests/test_class_traits.py
index 9893bc0..7a3dbfe 100644
--- a/traits/tests/test_class_traits.py
+++ b/traits/tests/test_class_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_clone.py b/traits/tests/test_clone.py
index 1a406f2..d195f8b 100644
--- a/traits/tests/test_clone.py
+++ b/traits/tests/test_clone.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_complex.py b/traits/tests/test_complex.py
new file mode 100644
index 0000000..3ad1abc
--- /dev/null
+++ b/traits/tests/test_complex.py
@@ -0,0 +1,175 @@
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
+# All rights reserved.
+#
+# This software is provided without warranty under the terms of the BSD
+# license included in LICENSE.txt and may be redistributed only under
+# the conditions described in the aforementioned license. The license
+# is also available online at http://www.enthought.com/licenses/BSD.txt
+#
+# Thanks for using Enthought open source!
+
+"""
+Tests for the Complex trait type.
+"""
+
+import unittest
+
+from traits.api import BaseComplex, Complex, Either, HasTraits, TraitError
+from traits.testing.optional_dependencies import numpy, requires_numpy
+
+
+class IntegerLike:
+    def __init__(self, value):
+        self._value = value
+
+    def __index__(self):
+        return self._value
+
+
+# Python versions < 3.8 don't support conversion of something with __index__
+# to complex.
+try:
+    complex(IntegerLike(3))
+except TypeError:
+    complex_accepts_index = False
+else:
+    complex_accepts_index = True
+
+
+class FloatLike:
+    def __init__(self, value):
+        self._value = value
+
+    def __float__(self):
+        return self._value
+
+
+class ComplexLike:
+    def __init__(self, value):
+        self._value = value
+
+    def __complex__(self):
+        return self._value
+
+
+class HasComplexTraits(HasTraits):
+    value = Complex()
+
+    # Assignment to the `Either` trait exercises a different C code path (see
+    # validate_trait_complex in ctraits.c). This use of "Either" should not
+    # be replaced with "Union", since "Union" does not exercise that same
+    # code path.
+    value_or_none = Either(None, Complex())
+
+
+class HasBaseComplexTraits(HasTraits):
+    value = BaseComplex()
+
+    value_or_none = Either(None, BaseComplex())
+
+
+class CommonComplexTests(object):
+    """ Common tests for Complex and BaseComplex. """
+
+    def test_default_value(self):
+        a = self.test_class()
+        self.assertIs(type(a.value), complex)
+        self.assertEqual(a.value, complex(0.0, 0.0))
+
+    def test_rejects_str(self):
+        a = self.test_class()
+        with self.assertRaises(TraitError):
+            a.value = "3j"
+
+    def test_accepts_int(self):
+        a = self.test_class()
+        a.value = 7
+        self.assertIs(type(a.value), complex)
+        self.assertEqual(a.value, complex(7.0, 0.0))
+
+    def test_accepts_float(self):
+        a = self.test_class()
+        a.value = 7.0
+        self.assertIs(type(a.value), complex)
+        self.assertEqual(a.value, complex(7.0, 0.0))
+
+    def test_accepts_complex(self):
+        a = self.test_class()
+        a.value = 7j
+        self.assertIs(type(a.value), complex)
+        self.assertEqual(a.value, complex(0.0, 7.0))
+
+    def test_accepts_complex_subclass(self):
+        class ComplexSubclass(complex):
+            pass
+
+        a = self.test_class()
+        a.value = ComplexSubclass(5.0, 12.0)
+        self.assertIs(type(a.value), complex)
+        self.assertEqual(a.value, complex(5.0, 12.0))
+
+    @unittest.skipUnless(
+        complex_accepts_index,
+        "complex does not support __index__ for this Python version",
+    )
+    def test_accepts_integer_like(self):
+        a = self.test_class()
+        a.value = IntegerLike(3)
+        self.assertIs(type(a.value), complex)
+        self.assertEqual(a.value, complex(3.0, 0.0))
+
+    def test_accepts_float_like(self):
+        a = self.test_class()
+        a.value = FloatLike(3.2)
+        self.assertIs(type(a.value), complex)
+        self.assertEqual(a.value, complex(3.2, 0.0))
+
+    def test_accepts_complex_like(self):
+        a = self.test_class()
+        a.value = ComplexLike(3.0 + 4j)
+        self.assertIs(type(a.value), complex)
+        self.assertEqual(a.value, complex(3.0, 4.0))
+
+    @requires_numpy
+    def test_accepts_numpy_values(self):
+        test_values = [
+            numpy.int32(23),
+            numpy.float32(3.7),
+            numpy.float64(2.3),
+            numpy.complex64(1.2 - 3.8j),
+            numpy.complex128(3.1 + 4.7j),
+        ]
+        for value in test_values:
+            with self.subTest(value=value):
+                a = self.test_class()
+                a.value = value
+                self.assertIs(type(a.value), complex)
+                self.assertEqual(a.value, complex(value))
+
+    def test_validate_trait_complex_code_path(self):
+        a = self.test_class()
+        a.value_or_none = 3.0 + 4j
+        self.assertIs(type(a.value_or_none), complex)
+        self.assertEqual(a.value_or_none, complex(3.0, 4.0))
+
+    def test_exceptions_propagated(self):
+        class CustomException(Exception):
+            pass
+
+        class BadComplexLike:
+            def __complex__(self):
+                raise CustomException("something went wrong")
+
+        a = self.test_class()
+        with self.assertRaises(CustomException):
+            a.value = BadComplexLike()
+
+
+class TestComplex(unittest.TestCase, CommonComplexTests):
+    def setUp(self):
+        self.test_class = HasComplexTraits
+
+
+class TestBaseComplex(unittest.TestCase, CommonComplexTests):
+    def setUp(self):
+        self.test_class = HasBaseComplexTraits
diff --git a/traits/tests/test_configure_traits.py b/traits/tests/test_configure_traits.py
index 1e30ddb..b7566e9 100644
--- a/traits/tests/test_configure_traits.py
+++ b/traits/tests/test_configure_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_constant.py b/traits/tests/test_constant.py
index dae4192..daf3afc 100644
--- a/traits/tests/test_constant.py
+++ b/traits/tests/test_constant.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_constants.py b/traits/tests/test_constants.py
index 407572a..98c5333 100644
--- a/traits/tests/test_constants.py
+++ b/traits/tests/test_constants.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_container_events.py b/traits/tests/test_container_events.py
index e594e56..f7beec3 100644
--- a/traits/tests/test_container_events.py
+++ b/traits/tests/test_container_events.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_copy_traits.py b/traits/tests/test_copy_traits.py
index d40f05c..d0fbc66 100644
--- a/traits/tests/test_copy_traits.py
+++ b/traits/tests/test_copy_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_copyable_trait_names.py b/traits/tests/test_copyable_trait_names.py
index 97c4e80..377c95d 100644
--- a/traits/tests/test_copyable_trait_names.py
+++ b/traits/tests/test_copyable_trait_names.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_ctraits.py b/traits/tests/test_ctraits.py
index 6e4135b..2b1e233 100644
--- a/traits/tests/test_ctraits.py
+++ b/traits/tests/test_ctraits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -56,6 +56,22 @@ class TestCTrait(unittest.TestCase):
             trait.default_value(), (DefaultValue.list_copy, [1, 2, 3])
         )
 
+    def test_validate_default_value_for_callable_and_args(self):
+
+        bad_values = [
+            None,
+            123,
+            (int, (2,)),
+            (int, 2, 3, 4),
+        ]
+
+        trait = CTrait(TraitKind.trait)
+        for value in bad_values:
+            with self.subTest(value=value):
+                with self.assertRaises(ValueError):
+                    trait.set_default_value(
+                        DefaultValue.callable_and_args, value)
+
     def test_default_value_for_set_is_deprecated(self):
         trait = CTrait(TraitKind.trait)
         with warnings.catch_warnings(record=True) as warn_msgs:
diff --git a/traits/tests/test_cythonized_traits.py b/traits/tests/test_cythonized_traits.py
index c4e4cde..ca7426c 100644
--- a/traits/tests/test_cythonized_traits.py
+++ b/traits/tests/test_cythonized_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_date.py b/traits/tests/test_date.py
index 9359079..2fcb083 100644
--- a/traits/tests/test_date.py
+++ b/traits/tests/test_date.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_datetime.py b/traits/tests/test_datetime.py
index b30c9b6..cf28e87 100644
--- a/traits/tests/test_datetime.py
+++ b/traits/tests/test_datetime.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_delegate.py b/traits/tests/test_delegate.py
index bf21c07..2b0e9cf 100644
--- a/traits/tests/test_delegate.py
+++ b/traits/tests/test_delegate.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_deprecated_handlers.py b/traits/tests/test_deprecated_handlers.py
index 28c0a97..0200334 100644
--- a/traits/tests/test_deprecated_handlers.py
+++ b/traits/tests/test_deprecated_handlers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_dict.py b/traits/tests/test_dict.py
index 04d2bc8..e152fde 100644
--- a/traits/tests/test_dict.py
+++ b/traits/tests/test_dict.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_directory.py b/traits/tests/test_directory.py
index 5167985..db4b335 100644
--- a/traits/tests/test_directory.py
+++ b/traits/tests/test_directory.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_dynamic_notifiers.py b/traits/tests/test_dynamic_notifiers.py
index 11e1ed6..d4bd014 100644
--- a/traits/tests/test_dynamic_notifiers.py
+++ b/traits/tests/test_dynamic_notifiers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_dynamic_trait_definition.py b/traits/tests/test_dynamic_trait_definition.py
index ecaf040..a71eb2b 100644
--- a/traits/tests/test_dynamic_trait_definition.py
+++ b/traits/tests/test_dynamic_trait_definition.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_editor_factories.py b/traits/tests/test_editor_factories.py
index 03ce4d6..5b31761 100644
--- a/traits/tests/test_editor_factories.py
+++ b/traits/tests/test_editor_factories.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_enum.py b/traits/tests/test_enum.py
index a18b059..b35632a 100644
--- a/traits/tests/test_enum.py
+++ b/traits/tests/test_enum.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_event_order.py b/traits/tests/test_event_order.py
index 831b3d7..b263242 100644
--- a/traits/tests/test_event_order.py
+++ b/traits/tests/test_event_order.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_expression.py b/traits/tests/test_expression.py
index 9ab005d..05799ed 100644
--- a/traits/tests/test_expression.py
+++ b/traits/tests/test_expression.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -12,6 +12,7 @@ import pickle
 import unittest
 
 from traits.api import Expression, HasTraits, Int, TraitError
+from traits.constants import DefaultValue
 
 
 class TestExpression(unittest.TestCase):
@@ -149,3 +150,15 @@ class TestExpression(unittest.TestCase):
         default_value_callable = reconstituted.default_value()[1]
 
         self.assertEqual(eval(default_value_callable(f)), 1)
+
+    def test_clone(self):
+        expr = Expression(default_value="1")
+        cloned_expr = expr.clone("2")
+
+        self.assertEqual(cloned_expr.default_value_type, DefaultValue.constant)
+        self.assertEqual(cloned_expr.default_value, "2")
+
+        self.assertEqual(
+            cloned_expr.as_ctrait().default_value_for(None, "expr"),
+            "2",
+        )
diff --git a/traits/tests/test_extended_notifiers.py b/traits/tests/test_extended_notifiers.py
index 8279485..eedff9f 100644
--- a/traits/tests/test_extended_notifiers.py
+++ b/traits/tests/test_extended_notifiers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_extended_trait_change.py b/traits/tests/test_extended_trait_change.py
index 4b4e98c..3f103e3 100644
--- a/traits/tests/test_extended_trait_change.py
+++ b/traits/tests/test_extended_trait_change.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_file.py b/traits/tests/test_file.py
index b8f3c01..5d32812 100644
--- a/traits/tests/test_file.py
+++ b/traits/tests/test_file.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_float.py b/traits/tests/test_float.py
index f105907..6613267 100644
--- a/traits/tests/test_float.py
+++ b/traits/tests/test_float.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -18,6 +18,24 @@ from traits.api import BaseFloat, Either, Float, HasTraits, Str, TraitError
 from traits.testing.optional_dependencies import numpy, requires_numpy
 
 
+class IntegerLike:
+    def __init__(self, value):
+        self._value = value
+
+    def __index__(self):
+        return self._value
+
+
+# Python versions < 3.8 don't support conversion of something with __index__
+# to float.
+try:
+    float(IntegerLike(3))
+except TypeError:
+    float_accepts_index = False
+else:
+    float_accepts_index = True
+
+
 class MyFloat(object):
     def __init__(self, value):
         self._value = value
@@ -93,6 +111,16 @@ class CommonFloatTests(object):
         self.assertIs(type(a.value_or_none), float)
         self.assertEqual(a.value_or_none, 2.0)
 
+    @unittest.skipUnless(
+        float_accepts_index,
+        "float does not support __index__ for this Python version",
+    )
+    def test_accepts_integer_like(self):
+        a = self.test_class()
+        a.value = IntegerLike(3)
+        self.assertIs(type(a.value), float)
+        self.assertEqual(a.value, 3.0)
+
     def test_accepts_float_like(self):
         a = self.test_class()
 
diff --git a/traits/tests/test_float_range.py b/traits/tests/test_float_range.py
index d254114..486f16d 100644
--- a/traits/tests/test_float_range.py
+++ b/traits/tests/test_float_range.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_get_traits.py b/traits/tests/test_get_traits.py
index 9b720cc..d0135a6 100644
--- a/traits/tests/test_get_traits.py
+++ b/traits/tests/test_get_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_has_required_traits.py b/traits/tests/test_has_required_traits.py
index 988b00d..a8a691e 100644
--- a/traits/tests/test_has_required_traits.py
+++ b/traits/tests/test_has_required_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_has_traits.py b/traits/tests/test_has_traits.py
index 3c98ff4..71287d8 100644
--- a/traits/tests/test_has_traits.py
+++ b/traits/tests/test_has_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -913,7 +913,7 @@ class TestHasTraitsObserveHook(unittest.TestCase):
         self.assertEqual(len(instance.events), 1)
 
     def test_observer_overridden(self):
-        # The handler is overriden, no change event should be registered.
+        # The handler is overridden, no change event should be registered.
         class BaseClass(HasTraits):
             events = List()
 
@@ -921,11 +921,11 @@ class TestHasTraitsObserveHook(unittest.TestCase):
             def handler(self, event):
                 self.events.append(event)
 
-        class SubclassOverriden(BaseClass):
+        class SubclassOverridden(BaseClass):
             value = Int()
             handler = None
 
-        instance = SubclassOverriden()
+        instance = SubclassOverridden()
         instance.value += 1
         self.assertEqual(len(instance.events), 0)
 
diff --git a/traits/tests/test_historical_unpickling.py b/traits/tests/test_historical_unpickling.py
index 0bb046a..acfc5dc 100644
--- a/traits/tests/test_historical_unpickling.py
+++ b/traits/tests/test_historical_unpickling.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_instance.py b/traits/tests/test_instance.py
index b4e44b7..012fc4a 100644
--- a/traits/tests/test_instance.py
+++ b/traits/tests/test_instance.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_int_range_long.py b/traits/tests/test_int_range_long.py
index 9af615b..a7e4641 100644
--- a/traits/tests/test_int_range_long.py
+++ b/traits/tests/test_int_range_long.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_integer.py b/traits/tests/test_integer.py
index d472f61..3f05198 100644
--- a/traits/tests/test_integer.py
+++ b/traits/tests/test_integer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_integer_range.py b/traits/tests/test_integer_range.py
index 5f86c26..48fc645 100644
--- a/traits/tests/test_integer_range.py
+++ b/traits/tests/test_integer_range.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_interface_checker.py b/traits/tests/test_interface_checker.py
index f7ed7ee..d6e594c 100644
--- a/traits/tests/test_interface_checker.py
+++ b/traits/tests/test_interface_checker.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_interfaces.py b/traits/tests/test_interfaces.py
index 2e013b6..bed13ac 100644
--- a/traits/tests/test_interfaces.py
+++ b/traits/tests/test_interfaces.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -30,6 +30,7 @@ from traits.api import (
     TraitError,
 )
 from traits.adaptation.api import reset_global_adaptation_manager
+from traits.constants import DefaultValue
 from traits.interface_checker import InterfaceError
 
 
@@ -118,6 +119,11 @@ class TraitsHolder(HasTraits):
     foo_plus_adapts_to = AdaptsTo(IFooPlus)
 
 
+class TraitsHolderSub(TraitsHolder):
+    foo_adapted_to = Sample()
+    foo_adapts_to = Sample()
+
+
 class SampleListAdapter(Adapter):
     def get_list(self):
         obj = self.adaptee
@@ -418,6 +424,46 @@ class InterfacesTest(unittest.TestCase):
         with self.assertRaises(TraitError):
             ta.a_no = provider
 
+    def test_clone_supports_defaults(self):
+        i_foo_trait = Supports(IFoo)
+        new_default = Sample()
+        i_foo_clone = i_foo_trait(new_default)
+        default_value_kind, default_value = i_foo_clone.default_value()
+
+        # this is sub-optimal but matches Instance trait, see #1630
+        self.assertEqual(default_value_kind, DefaultValue.constant)
+        self.assertIsInstance(default_value, SampleFooAdapter)
+
+        ctrait_default = i_foo_clone.as_ctrait().default_value_for(None, "foo")
+        self.assertIsInstance(ctrait_default, SampleFooAdapter)
+
+    def test_clone_adapts_to_default(self):
+        i_foo_trait = AdaptsTo(IFoo)
+        new_default = Sample()
+        i_foo_clone = i_foo_trait(new_default)
+        default_value_kind, default_value = i_foo_clone.default_value()
+
+        # this is sub-optimal but matches Instance trait, see #1630
+        self.assertEqual(default_value_kind, DefaultValue.constant)
+        self.assertIs(default_value, new_default)
+
+        ctrait_default = i_foo_clone.as_ctrait().default_value_for(None, "foo")
+        self.assertIs(ctrait_default, new_default)
+
+    def test_subclass_supports_default(self):
+        s1 = TraitsHolderSub()
+        s2 = TraitsHolderSub()
+
+        # this is sub-optimal but matches Instance trait, see #1630
+        self.assertIs(s1.foo_adapted_to, s2.foo_adapted_to)
+
+    def test_subclass_adapts_to_default(self):
+        s1 = TraitsHolderSub()
+        s2 = TraitsHolderSub()
+
+        # this is sub-optimal but matches Instance trait, see #1630
+        self.assertIs(s1.foo_adapts_to, s2.foo_adapts_to)
+
     @contextlib.contextmanager
     def set_check_interfaces(self, check_interfaces_value):
         """
diff --git a/traits/tests/test_keyword_args.py b/traits/tests/test_keyword_args.py
index ff1f2e3..049bd83 100644
--- a/traits/tests/test_keyword_args.py
+++ b/traits/tests/test_keyword_args.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_list.py b/traits/tests/test_list.py
index f9feab5..5742f37 100644
--- a/traits/tests/test_list.py
+++ b/traits/tests/test_list.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_list_events.py b/traits/tests/test_list_events.py
index c73178d..3e6c3e7 100644
--- a/traits/tests/test_list_events.py
+++ b/traits/tests/test_list_events.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_listeners.py b/traits/tests/test_listeners.py
index fcba569..65fdd0d 100644
--- a/traits/tests/test_listeners.py
+++ b/traits/tests/test_listeners.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_long_traits.py b/traits/tests/test_long_traits.py
index 53f66c1..d2c6d4a 100644
--- a/traits/tests/test_long_traits.py
+++ b/traits/tests/test_long_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_map.py b/traits/tests/test_map.py
index a37c3a0..eb4b44c 100644
--- a/traits/tests/test_map.py
+++ b/traits/tests/test_map.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_new_notifiers.py b/traits/tests/test_new_notifiers.py
index e66a3ea..5eb903f 100644
--- a/traits/tests/test_new_notifiers.py
+++ b/traits/tests/test_new_notifiers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_none.py b/traits/tests/test_none.py
index a28f884..d732fbb 100644
--- a/traits/tests/test_none.py
+++ b/traits/tests/test_none.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_observe.py b/traits/tests/test_observe.py
index 3ac6f69..2b71556 100644
--- a/traits/tests/test_observe.py
+++ b/traits/tests/test_observe.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_pickle_validated_dict.py b/traits/tests/test_pickle_validated_dict.py
index 5d2268b..353f046 100644
--- a/traits/tests/test_pickle_validated_dict.py
+++ b/traits/tests/test_pickle_validated_dict.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_prefix_list.py b/traits/tests/test_prefix_list.py
index 18f7b0f..538e67f 100644
--- a/traits/tests/test_prefix_list.py
+++ b/traits/tests/test_prefix_list.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_prefix_map.py b/traits/tests/test_prefix_map.py
index b97628f..9695409 100644
--- a/traits/tests/test_prefix_map.py
+++ b/traits/tests/test_prefix_map.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_property_delete.py b/traits/tests/test_property_delete.py
index 5dc2e40..f898e97 100644
--- a/traits/tests/test_property_delete.py
+++ b/traits/tests/test_property_delete.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_property_notifications.py b/traits/tests/test_property_notifications.py
index a1066e7..cf45d0b 100644
--- a/traits/tests/test_property_notifications.py
+++ b/traits/tests/test_property_notifications.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -35,7 +35,7 @@ from traits.observation.api import (
 )
 
 
-class Test(HasTraits):
+class HasProperty(HasTraits):
 
     output_buffer = Any()
 
@@ -51,7 +51,7 @@ class Test(HasTraits):
     value = Property(__value_get, __value_set)
 
 
-class Test_1(Test):
+class HasPropertySubclass(HasProperty):
     def _value_changed(self, value):
         self.output_buffer.write(value)
 
@@ -60,7 +60,7 @@ class TestPropertyNotifications(unittest.TestCase):
     def test_property_notifications(self):
         output_buffer = io.StringIO()
 
-        test_obj = Test_1(output_buffer=output_buffer)
+        test_obj = HasPropertySubclass(output_buffer=output_buffer)
         test_obj.value = "value_1"
         self.assertEqual(output_buffer.getvalue(), "value_1")
 
diff --git a/traits/tests/test_python_properties.py b/traits/tests/test_python_properties.py
index 511b767..24da355 100644
--- a/traits/tests/test_python_properties.py
+++ b/traits/tests/test_python_properties.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_range.py b/traits/tests/test_range.py
index 2da86f3..c9d088b 100644
--- a/traits/tests/test_range.py
+++ b/traits/tests/test_range.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_readonly.py b/traits/tests/test_readonly.py
index aa5dd41..30c197a 100644
--- a/traits/tests/test_readonly.py
+++ b/traits/tests/test_readonly.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_regression.py b/traits/tests/test_regression.py
index 9cf21a0..9db92d2 100644
--- a/traits/tests/test_regression.py
+++ b/traits/tests/test_regression.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -22,15 +22,19 @@ from traits.has_traits import (
 )
 from traits.testing.optional_dependencies import numpy, requires_numpy
 from traits.trait_errors import TraitError
-from traits.trait_type import TraitType
+from traits.trait_list_object import TraitListObject
+from traits.trait_type import NoDefaultSpecified, TraitType
 from traits.trait_types import (
     Bool,
     DelegatesTo,
     Dict,
     Either,
+    Enum,
+    Expression,
     Instance,
     Int,
     List,
+    self,
     Set,
     Str,
     Union,
@@ -145,6 +149,115 @@ class RaisingValidator(TraitType):
         raise ZeroDivisionError("Just testing")
 
 
+class Wrapper(HasTraits):
+
+    value = Str()
+
+
+class WrapperTrait(TraitType):
+
+    def __init__(self, default_value="", **metadata):
+        self.default_value_type, default_value = self._get_default_value(
+            self.validate(None, None, default_value)
+        )
+        super().__init__(default_value, **metadata)
+
+    def validate(self, object, name, value):
+        if isinstance(value, str):
+            return Wrapper(value=value)
+        elif isinstance(value, Wrapper):
+            return value
+        else:
+            self.error(None, None, value)
+
+    def _get_default_value(self, value):
+        return (
+            DefaultValue.callable_and_args,
+            (Wrapper, (), {"value": value.value}),
+        )
+
+
+class CloneWrapperTrait(TraitType):
+
+    def __init__(self, default_value="", **metadata):
+        self.default_value_type, default_value = self._get_default_value(
+            self.validate(None, None, default_value)
+        )
+        super().__init__(default_value, **metadata)
+
+    def validate(self, object, name, value):
+        if isinstance(value, str):
+            return Wrapper(value=value)
+        elif isinstance(value, Wrapper):
+            return value
+        else:
+            self.error(None, None, value)
+
+    def _get_default_value(self, value):
+        return (
+            DefaultValue.callable_and_args,
+            (Wrapper, (), {"value": value.value}),
+        )
+
+    def clone(self, default_value=NoDefaultSpecified, **metadata):
+        new = super().clone(default_value, **metadata)
+        if default_value is not NoDefaultSpecified:
+            default_value = new.validate(None, None, default_value)
+            type, value = new._get_default_value(default_value)
+            new.default_value_type = type
+            new.default_value = value
+        return new
+
+
+class DisallowDefaultValue(TraitType):
+    default_value_type = DefaultValue.disallow
+
+
+class SubclassDefaultsSuper(HasTraits):
+
+    a_str = Str()
+
+    an_expr = Expression("[]")
+
+    a_list = List()
+
+    an_instance = Instance(Wrapper)
+
+    a_wrapper_1 = WrapperTrait("bar")
+
+    a_wrapper_2 = WrapperTrait()
+
+    clone_wrapper_1 = CloneWrapperTrait("bar")
+
+    clone_wrapper_2 = CloneWrapperTrait()
+
+    disallow_default = DisallowDefaultValue()
+
+    self_trait = self()
+
+
+class SubclassDefaultsSub(SubclassDefaultsSuper):
+
+    a_str = "foo"
+
+    an_expr = Expression("[1, 2, 3]")
+
+    a_list = [1, 2, 3]
+
+    an_instance = Wrapper()
+
+    a_wrapper_1 = "foo"
+
+    a_wrapper_2 = Wrapper(value="foo")
+
+    clone_wrapper_1 = "foo"
+
+    clone_wrapper_2 = Wrapper(value="foo")
+
+    # self effectively becomes a This() trait if default is overriden
+    self_trait = SubclassDefaultsSuper()
+
+
 class TestRegression(unittest.TestCase):
     def test_default_value_for_no_cache(self):
         """ Make sure that CTrait.default_value_for() does not cache the
@@ -309,6 +422,140 @@ class TestRegression(unittest.TestCase):
         with self.assertRaises(ZeroDivisionError):
             a.bar = "foo"
 
+    def test_clone_list_of_enum_trait(self):
+        # Regression test for enthought/traits#1622.
+
+        class Order(HasTraits):
+            menu = List(Str)
+            selection = List(Enum(values="menu"))
+
+        order = Order(menu=["fish"], selection=["fish"])
+        clone = order.clone_traits()
+
+        self.assertEqual(clone.selection, ["fish"])
+
+        order.selection.append('fish')
+        self.assertEqual(clone.selection, ['fish'])
+
+        with self.assertRaises(TraitError):
+            clone.selection.append("bouillabaisse")
+
+    def test_clone_list_trait_default(self):
+        # Regression test for #1630
+        t = List()
+        new_default = [1, 2, 3]
+        t_clone = t(new_default)
+        default_value_kind, default_value = t_clone.default_value()
+
+        self.assertEqual(default_value_kind, DefaultValue.trait_list_object)
+        self.assertEqual(default_value, new_default)
+        self.assertIsNot(default_value, new_default)
+
+    def test_clone_dict_trait_default(self):
+        # Regression test for #1630
+        t = Dict()
+        new_default = {'a': 1, 'b': 2, 'c': 3}
+        t_clone = t(new_default)
+        default_value_kind, default_value = t_clone.default_value()
+
+        self.assertEqual(default_value_kind, DefaultValue.trait_dict_object)
+        self.assertEqual(default_value, new_default)
+        self.assertIsNot(default_value, new_default)
+
+    def test_clone_set_trait_default(self):
+        # Regression test for #1630
+        t = Set()
+        new_default = {1, 2, 3}
+        t_clone = t(new_default)
+        default_value_kind, default_value = t_clone.default_value()
+
+        self.assertEqual(default_value_kind, DefaultValue.trait_set_object)
+        self.assertEqual(default_value, new_default)
+        self.assertIsNot(default_value, new_default)
+
+    def test_clone_disallow_default_value(self):
+        t = DisallowDefaultValue()
+        with self.assertRaises(TraitError):
+            t("default value")
+
+    def test_clone_setattr_original_value(self):
+        t = Expression()
+        t_clone = t("3")
+        default_value_kind, default_value = t_clone.default_value()
+
+        self.assertEqual(default_value_kind, DefaultValue.constant)
+        self.assertEqual(default_value, "3")
+
+    def test_subclass_default_constant(self):
+        # Regression test for #1630 and similar issues
+        s1 = SubclassDefaultsSub()
+        s2 = SubclassDefaultsSub()
+
+        # existing behaviour that should not be affected
+        self.assertEqual(s1.a_str, "foo")
+        self.assertEqual(s1.an_expr, "[1, 2, 3]")
+        self.assertEqual(s2.an_expr, "[1, 2, 3]")
+
+    def test_subclass_default_callable_and_args(self):
+        # Regression test for #1630 and similar issues
+        s1 = SubclassDefaultsSub()
+        s2 = SubclassDefaultsSub()
+
+        # the following is a bit questionable, but is existing behaviour
+        self.assertIsInstance(s1.an_instance, Wrapper)
+        self.assertIsInstance(s2.an_instance, Wrapper)
+        self.assertIs(s1.an_instance, s2.an_instance)
+
+        self.assertIsInstance(s1.a_wrapper_1, Wrapper)
+        self.assertIsInstance(s2.a_wrapper_1, Wrapper)
+        self.assertIs(s1.a_wrapper_1, s2.a_wrapper_1)
+
+        self.assertIsInstance(s1.a_wrapper_2, Wrapper)
+        self.assertIsInstance(s2.a_wrapper_2, Wrapper)
+        self.assertIs(s1.a_wrapper_2, s2.a_wrapper_2)
+
+    def test_subclass_default_object_kind(self):
+        # Regression test for #1630 and similar issues
+        s1 = SubclassDefaultsSub()
+        s2 = SubclassDefaultsSub()
+
+        # the following is a bit odd, but is existing behaviour
+        self.assertIsInstance(s1.self_trait, SubclassDefaultsSuper)
+        self.assertIsInstance(s2.self_trait, SubclassDefaultsSuper)
+        self.assertIs(s1.self_trait, s2.self_trait)
+        self.assertIsNot(s1, s1.self_trait)
+
+    def test_subclass_default_trait_list_object(self):
+        # Regression test for #1630 and similar issues
+        s1 = SubclassDefaultsSub()
+        s2 = SubclassDefaultsSub()
+
+        # behaviour which is broken in #1630
+        # things which need to be copied:
+        self.assertEqual(s1.a_list, [1, 2, 3])
+        self.assertEqual(s2.a_list, [1, 2, 3])
+        self.assertIsNot(s1.a_list, s2.a_list)
+        self.assertIsInstance(s1.a_list, TraitListObject)
+
+    def test_subclass_callable_and_args_overrides_clone(self):
+        # Regression test for #1630 and similar issues
+        s1 = SubclassDefaultsSub()
+        s2 = SubclassDefaultsSub()
+
+        # callable_with_args case - handle overriding clone
+        self.assertIsInstance(s1.clone_wrapper_1, Wrapper)
+        self.assertIsInstance(s2.clone_wrapper_1, Wrapper)
+        self.assertIsNot(s1.clone_wrapper_1, s2.clone_wrapper_1)
+
+        self.assertIsInstance(s1.clone_wrapper_2, Wrapper)
+        self.assertIsInstance(s2.clone_wrapper_2, Wrapper)
+        self.assertIsNot(s1.clone_wrapper_2, s2.clone_wrapper_2)
+
+    def test_subclass_disallow_default_value(self):
+        with self.assertRaises(TraitError):
+            class OverrideDisallow(SubclassDefaultsSuper):
+                disallow_default = "a default value"
+
 
 class NestedContainerClass(HasTraits):
     # Used in regression test for changes to nested containers
diff --git a/traits/tests/test_rich_compare.py b/traits/tests/test_rich_compare.py
index bd0dbfa..9600775 100644
--- a/traits/tests/test_rich_compare.py
+++ b/traits/tests/test_rich_compare.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_special_event_handlers.py b/traits/tests/test_special_event_handlers.py
index 5249fa9..9f12bc6 100644
--- a/traits/tests/test_special_event_handlers.py
+++ b/traits/tests/test_special_event_handlers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_static_notifiers.py b/traits/tests/test_static_notifiers.py
index 2ccc6fb..a1c9a41 100644
--- a/traits/tests/test_static_notifiers.py
+++ b/traits/tests/test_static_notifiers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_str_handler.py b/traits/tests/test_str_handler.py
index a83295b..c87caf7 100644
--- a/traits/tests/test_str_handler.py
+++ b/traits/tests/test_str_handler.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_string.py b/traits/tests/test_string.py
index 19fb22e..2229d03 100644
--- a/traits/tests/test_string.py
+++ b/traits/tests/test_string.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_sync_traits.py b/traits/tests/test_sync_traits.py
index 2e7ff26..e6b54cb 100644
--- a/traits/tests/test_sync_traits.py
+++ b/traits/tests/test_sync_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_target.py b/traits/tests/test_target.py
index 8134b3a..e59dd41 100644
--- a/traits/tests/test_target.py
+++ b/traits/tests/test_target.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_time.py b/traits/tests/test_time.py
index afdcbf6..2f0fe69 100644
--- a/traits/tests/test_time.py
+++ b/traits/tests/test_time.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_base.py b/traits/tests/test_trait_base.py
index e424422..d02b00b 100644
--- a/traits/tests/test_trait_base.py
+++ b/traits/tests/test_trait_base.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_change_event_tracer.py b/traits/tests/test_trait_change_event_tracer.py
index f5ed09d..b73628a 100644
--- a/traits/tests/test_trait_change_event_tracer.py
+++ b/traits/tests/test_trait_change_event_tracer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_converters.py b/traits/tests/test_trait_converters.py
index 3e77b95..b2caa59 100644
--- a/traits/tests/test_trait_converters.py
+++ b/traits/tests/test_trait_converters.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_cycle.py b/traits/tests/test_trait_cycle.py
index bac2810..52d7b0e 100644
--- a/traits/tests/test_trait_cycle.py
+++ b/traits/tests/test_trait_cycle.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_default_initializer.py b/traits/tests/test_trait_default_initializer.py
index 3556290..8f230b8 100644
--- a/traits/tests/test_trait_default_initializer.py
+++ b/traits/tests/test_trait_default_initializer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_dict_list_set_event.py b/traits/tests/test_trait_dict_list_set_event.py
index 0f12706..16d7ad2 100644
--- a/traits/tests/test_trait_dict_list_set_event.py
+++ b/traits/tests/test_trait_dict_list_set_event.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_dict_object.py b/traits/tests/test_trait_dict_object.py
index 80ac702..f5cd4be 100644
--- a/traits/tests/test_trait_dict_object.py
+++ b/traits/tests/test_trait_dict_object.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -14,7 +14,7 @@ import sys
 import unittest
 from unittest import mock
 
-from traits.api import HasTraits
+from traits.api import DefaultValue, HasTraits, TraitType, ValidateTrait
 from traits.trait_dict_object import TraitDict, TraitDictEvent, TraitDictObject
 from traits.trait_errors import TraitError
 from traits.trait_types import Dict, Int, Str
@@ -34,6 +34,18 @@ def int_validator(value):
         raise TraitError
 
 
+class RangeInstance(TraitType):
+    """
+    Dummy custom trait type for use in validation tests.
+    """
+
+    default_value_type = DefaultValue.constant
+
+    default_value = range(10)
+
+    fast_validate = ValidateTrait.coerce, range
+
+
 class TestTraitDict(unittest.TestCase):
 
     def setUp(self):
@@ -434,6 +446,46 @@ class TestTraitDictObject(unittest.TestCase):
         tdo_unpickled.value_validator(1)
         tdo_unpickled.value_validator(True)
 
+    def test_disconnected_dict(self):
+        # Objects that are disconnected from their HasTraits "owner" can arise
+        # as a result of clone_traits operations, or of serialization and
+        # deserialization.
+        disconnected = TraitDictObject(
+            trait=Dict(Str, Str),
+            object=None,
+            name="foo",
+            value={},
+        )
+        self.assertEqual(disconnected.object(), None)
+
+    def test_key_validation_uses_ctrait(self):
+        # Regression test for enthought/traits#1619
+
+        class HasRanges(HasTraits):
+            ranges = Dict(RangeInstance(), Int())
+
+        obj = HasRanges()
+
+        with self.assertRaises(TraitError):
+            obj.ranges[3] = 27
+
+        obj.ranges[range(10, 20)] = 3
+        self.assertEqual(obj.ranges, {range(10, 20): 3})
+
+    def test_value_validation_uses_ctrait(self):
+        # Regression test for enthought/traits#1619
+
+        class HasRanges(HasTraits):
+            ranges = Dict(Int(), RangeInstance())
+
+        obj = HasRanges()
+
+        with self.assertRaises(TraitError):
+            obj.ranges[3] = 27
+
+        obj.ranges[3] = range(10, 20)
+        self.assertEqual(obj.ranges, {3: range(10, 20)})
+
 
 class TestTraitDictEvent(unittest.TestCase):
 
diff --git a/traits/tests/test_trait_exceptions.py b/traits/tests/test_trait_exceptions.py
index 0b114ab..3637b3a 100644
--- a/traits/tests/test_trait_exceptions.py
+++ b/traits/tests/test_trait_exceptions.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_get_set.py b/traits/tests/test_trait_get_set.py
index a2314d1..fdb5437 100644
--- a/traits/tests/test_trait_get_set.py
+++ b/traits/tests/test_trait_get_set.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_list_dict.py b/traits/tests/test_trait_list_dict.py
index a0c3c86..239e7cd 100644
--- a/traits/tests/test_trait_list_dict.py
+++ b/traits/tests/test_trait_list_dict.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_list_object.py b/traits/tests/test_trait_list_object.py
index c8b4cd0..80a50f7 100644
--- a/traits/tests/test_trait_list_object.py
+++ b/traits/tests/test_trait_list_object.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -13,7 +13,14 @@ import operator
 import pickle
 import unittest.mock
 
-from traits.api import HasTraits, Int, List
+from traits.api import (
+    DefaultValue,
+    HasTraits,
+    Int,
+    List,
+    TraitType,
+    ValidateTrait,
+)
 from traits.testing.optional_dependencies import numpy, requires_numpy
 from traits.trait_base import _validate_everything
 from traits.trait_errors import TraitError
@@ -1457,3 +1464,36 @@ class TestTraitListObject(unittest.TestCase):
         self.assertEqual(list_object, [1, 2, 3, 4, 5])
         with self.assertRaises(TraitError):
             list_object.append(4)
+
+    def test_disconnected_list(self):
+        # Objects that are disconnected from their HasTraits "owner" can arise
+        # as a result of clone_traits operations, or of serialization and
+        # deserialization.
+        disconnected = TraitListObject(
+            trait=List(Int),
+            object=None,
+            name="foo",
+            value=[1, 2, 3],
+        )
+        self.assertEqual(disconnected.object(), None)
+
+    def test_item_validation_uses_ctrait(self):
+        # Regression test for enthought/traits#1619
+
+        class RangeInstance(TraitType):
+            default_value_type = DefaultValue.constant
+
+            default_value = range(10)
+
+            fast_validate = ValidateTrait.coerce, range
+
+        class HasRanges(HasTraits):
+            ranges = List(RangeInstance())
+
+        obj = HasRanges()
+
+        with self.assertRaises(TraitError):
+            obj.ranges.append(23)
+
+        obj.ranges.append(range(10, 20))
+        self.assertEqual(obj.ranges, [range(10, 20)])
diff --git a/traits/tests/test_trait_prefix_list.py b/traits/tests/test_trait_prefix_list.py
index 424a4c1..b589dee 100644
--- a/traits/tests/test_trait_prefix_list.py
+++ b/traits/tests/test_trait_prefix_list.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_trait_set_object.py b/traits/tests/test_trait_set_object.py
index 217d936..321b676 100644
--- a/traits/tests/test_trait_set_object.py
+++ b/traits/tests/test_trait_set_object.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -11,10 +11,17 @@ import pickle
 import unittest
 from unittest import mock
 
-from traits.api import HasTraits, Set, Str
+from traits.api import (
+    DefaultValue,
+    HasTraits,
+    Set,
+    Str,
+    TraitType,
+    ValidateTrait,
+)
 from traits.trait_base import _validate_everything
 from traits.trait_errors import TraitError
-from traits.trait_set_object import TraitSet, TraitSetEvent
+from traits.trait_set_object import TraitSet, TraitSetEvent, TraitSetObject
 from traits.trait_types import _validate_int
 
 
@@ -517,6 +524,39 @@ class TestTraitSetObject(unittest.TestCase):
         # then
         notifier.assert_not_called()
 
+    def test_disconnected_set(self):
+        # Objects that are disconnected from their HasTraits "owner" can arise
+        # as a result of clone_traits operations, or of serialization and
+        # deserialization.
+        disconnected = TraitSetObject(
+            trait=Set(Str),
+            object=None,
+            name="foo",
+            value=set(),
+        )
+        self.assertEqual(disconnected.object(), None)
+
+    def test_item_validation_uses_ctrait(self):
+        # Regression test for enthought/traits#1619
+
+        class RangeInstance(TraitType):
+            default_value_type = DefaultValue.constant
+
+            default_value = range(10)
+
+            fast_validate = ValidateTrait.coerce, range
+
+        class HasRanges(HasTraits):
+            ranges = Set(RangeInstance())
+
+        obj = HasRanges()
+
+        with self.assertRaises(TraitError):
+            obj.ranges.add(23)
+
+        obj.ranges.add(range(10, 20))
+        self.assertEqual(obj.ranges, {range(10, 20)})
+
 
 class TestTraitSetEvent(unittest.TestCase):
 
diff --git a/traits/tests/test_trait_types.py b/traits/tests/test_trait_types.py
index 1dc6cda..5614266 100644
--- a/traits/tests/test_trait_types.py
+++ b/traits/tests/test_trait_types.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -53,10 +53,10 @@ class TraitTypesTest(unittest.TestCase):
         # If 'numpy' is available, the numpy validators should be loaded,
         # even if numpy is imported after traits.
         test_script = textwrap.dedent("""
-            from traits.trait_types import float_fast_validate
+            from traits.trait_types import bool_fast_validate
             import numpy
 
-            if numpy.floating in float_fast_validate:
+            if numpy.bool_ in bool_fast_validate:
                 print("Success")
             else:
                 print("Failure")
@@ -132,6 +132,20 @@ class TraitTypesTest(unittest.TestCase):
         with self.assertRaises(ValueError):
             ctrait.default_value_for(None, "<dummy>")
 
+    def test_call_sets_default_value_type(self):
+        class FooTrait(TraitType):
+            default_value_type = DefaultValue.callable_and_args
+
+            def __init__(self, default_value=NoDefaultSpecified, **metadata):
+                default_value = (pow, (3, 4), {})
+                super().__init__(default_value, **metadata)
+
+        trait = FooTrait()
+        ctrait = trait.as_ctrait()
+        self.assertEqual(ctrait.default_value_for(None, "dummy"), 81)
+        cloned_ctrait = trait(30)
+        self.assertEqual(cloned_ctrait.default_value_for(None, "dummy"), 30)
+
 
 class TestDeprecatedTraitTypes(unittest.TestCase):
     def test_function_deprecated(self):
diff --git a/traits/tests/test_traits.py b/traits/tests/test_traits.py
index 1315ddd..1202da1 100644
--- a/traits/tests/test_traits.py
+++ b/traits/tests/test_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_traits_listener.py b/traits/tests/test_traits_listener.py
index 7d4d13c..8da9715 100644
--- a/traits/tests/test_traits_listener.py
+++ b/traits/tests/test_traits_listener.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_tuple.py b/traits/tests/test_tuple.py
index 3ffea8e..367a61e 100644
--- a/traits/tests/test_tuple.py
+++ b/traits/tests/test_tuple.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -73,3 +73,22 @@ class TupleTestCase(TupleTestMixin, unittest.TestCase):
         b = A()
         self.assertEqual(a.foo, (0, ("", 0)))
         self.assertIs(a.foo, b.foo)
+
+    def test_lists_not_accepted(self):
+
+        class A(HasTraits):
+            foo = Tuple(Int(), Int())
+
+        a = A()
+        with self.assertRaises(TraitError):
+            a.foo = [2, 3]
+
+    def test_deprecated_list_validation(self):
+        class A(HasTraits):
+            foo = Tuple()
+
+        a = A()
+        with self.assertWarns(DeprecationWarning):
+            a.foo = [2, 3]
+
+        self.assertEqual(a.foo, (2, 3))
diff --git a/traits/tests/test_type.py b/traits/tests/test_type.py
index 2ebe8d6..c37a910 100644
--- a/traits/tests/test_type.py
+++ b/traits/tests/test_type.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_ui_notifiers.py b/traits/tests/test_ui_notifiers.py
index 658ebc0..b38f5d7 100644
--- a/traits/tests/test_ui_notifiers.py
+++ b/traits/tests/test_ui_notifiers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_undefined.py b/traits/tests/test_undefined.py
index 711e6e3..0d9468a 100644
--- a/traits/tests/test_undefined.py
+++ b/traits/tests/test_undefined.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_unicode_traits.py b/traits/tests/test_unicode_traits.py
index c231ad4..1b0cb4b 100644
--- a/traits/tests/test_unicode_traits.py
+++ b/traits/tests/test_unicode_traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_union.py b/traits/tests/test_union.py
index dbe5842..75581ee 100644
--- a/traits/tests/test_union.py
+++ b/traits/tests/test_union.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_uuid.py b/traits/tests/test_uuid.py
index a1b682c..97d2065 100644
--- a/traits/tests/test_uuid.py
+++ b/traits/tests/test_uuid.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_validated_tuple.py b/traits/tests/test_validated_tuple.py
index 8ee3375..0c8ecdc 100644
--- a/traits/tests/test_validated_tuple.py
+++ b/traits/tests/test_validated_tuple.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_version.py b/traits/tests/test_version.py
index b43276a..17e28c9 100644
--- a/traits/tests/test_version.py
+++ b/traits/tests/test_version.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_view_elements.py b/traits/tests/test_view_elements.py
index a7db986..bb82252 100644
--- a/traits/tests/test_view_elements.py
+++ b/traits/tests/test_view_elements.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/test_weak_ref.py b/traits/tests/test_weak_ref.py
index 0b84b96..f2d6372 100644
--- a/traits/tests/test_weak_ref.py
+++ b/traits/tests/test_weak_ref.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/tests/tuple_test_mixin.py b/traits/tests/tuple_test_mixin.py
index 25278d8..54eab4a 100644
--- a/traits/tests/tuple_test_mixin.py
+++ b/traits/tests/tuple_test_mixin.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/trait_base.py b/traits/trait_base.py
index 2e084c4..b4c8707 100644
--- a/traits/trait_base.py
+++ b/traits/trait_base.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -20,9 +20,6 @@ from weakref import ref
 
 from .etsconfig.api import ETSConfig
 
-# backwards compatibility: trait_base used to provide a patched enumerate
-enumerate = enumerate
-
 # Constants
 
 SequenceTypes = (list, tuple)
diff --git a/traits/trait_converters.py b/traits/trait_converters.py
index 495017b..ceffc76 100644
--- a/traits/trait_converters.py
+++ b/traits/trait_converters.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/trait_dict_object.py b/traits/trait_dict_object.py
index b7164e4..3a4cd96 100644
--- a/traits/trait_dict_object.py
+++ b/traits/trait_dict_object.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -414,8 +414,9 @@ class TraitDictObject(TraitDict):
     trait : CTrait instance
         The CTrait instance associated with the attribute that this dict
         has been set to.
-    object : HasTraits instance
-        The HasTraits instance that the dict has been set as an attribute for.
+    object : HasTraits
+        The object this dict belongs to. Can also be None in cases where the
+        dict has been disconnected from its HasTraits parent.
     name : str
         The name of the attribute on the object.
     value : dict
@@ -426,9 +427,9 @@ class TraitDictObject(TraitDict):
     trait : CTrait instance
         The CTrait instance associated with the attribute that this dict
         has been set to.
-    object : weak reference to a HasTraits instance
-        A weak reference to a HasTraits instance that the dict has been set
-        as an attribute for.
+    object : callable
+        A callable that when called with no arguments returns the HasTraits
+        object that this dict belongs to, or None if there is no such object.
     name : str
         The name of the attribute on the object.
     name_items : str
@@ -438,7 +439,7 @@ class TraitDictObject(TraitDict):
 
     def __init__(self, trait, object, name, value):
         self.trait = trait
-        self.object = ref(object)
+        self.object = (lambda: None) if object is None else ref(object)
         self.name = name
         self.name_items = None
         if trait.has_items:
@@ -449,7 +450,7 @@ class TraitDictObject(TraitDict):
                          notifiers=[self.notifier])
 
     def _key_validator(self, key):
-        """ Calls the trait's key_trait.handler.validate.
+        """ Key validator based on the Dict's key_trait.
 
         Parameters
         ----------
@@ -475,7 +476,7 @@ class TraitDictObject(TraitDict):
         if trait is None or object is None:
             return key
 
-        validate = trait.key_trait.handler.validate
+        validate = trait.key_trait.validate
         if validate is None:
             return key
 
@@ -486,7 +487,7 @@ class TraitDictObject(TraitDict):
             raise excep
 
     def _value_validator(self, value):
-        """ Calls the trait's value_handler.validate
+        """ Value validator based on the Dict's value_trait.
 
         Parameters
         ----------
@@ -512,7 +513,7 @@ class TraitDictObject(TraitDict):
         if trait is None or object is None:
             return value
 
-        validate = trait.value_handler.validate
+        validate = trait.value_trait.validate
         if validate is None:
             return value
 
@@ -585,7 +586,7 @@ class TraitDictObject(TraitDict):
         """
         result = TraitDictObject(
             self.trait,
-            lambda: None,
+            None,
             self.name,
             dict(copy.deepcopy(x, memo) for x in self.items()),
         )
diff --git a/traits/trait_errors.py b/traits/trait_errors.py
index fc992c8..1b2153e 100644
--- a/traits/trait_errors.py
+++ b/traits/trait_errors.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/trait_factory.py b/traits/trait_factory.py
index 82669df..7d65488 100644
--- a/traits/trait_factory.py
+++ b/traits/trait_factory.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/trait_handler.py b/traits/trait_handler.py
index 12673ec..2833d3d 100644
--- a/traits/trait_handler.py
+++ b/traits/trait_handler.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/trait_handlers.py b/traits/trait_handlers.py
index eba8b3d..08c8d53 100644
--- a/traits/trait_handlers.py
+++ b/traits/trait_handlers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -525,6 +525,10 @@ class TraitPrefixList(TraitHandler):
     list of specified string values, or is a unique prefix of one of those
     values.
 
+    .. deprecated:: 6.1
+        :class:`~.TraitPrefixList` is scheduled for removal in Traits
+        7.0. Use the :class:`~.PrefixList` trait type instead.
+
     TraitPrefixList is a variation on TraitEnum. The values that can be
     assigned to a trait attribute defined using a TraitPrefixList handler is
     the set of all strings supplied to the TraitPrefixList constructor, as well
@@ -706,6 +710,10 @@ class TraitMap(TraitHandler):
 class TraitPrefixMap(TraitMap):
     """A cross between the TraitPrefixList and TraitMap classes.
 
+    .. deprecated:: 6.1
+        :class:`~.TraitPrefixMap` is scheduled for removal
+        in Traits 7.0. Use the :class:`~.PrefixMap` trait type instead.
+
     Like TraitMap, TraitPrefixMap is created using a dictionary, but in this
     case, the keys of the dictionary must be strings. Like TraitPrefixList,
     a string *v* is a valid value for the trait attribute if it is a prefix of
diff --git a/traits/trait_list_object.py b/traits/trait_list_object.py
index 7627075..c32a36e 100644
--- a/traits/trait_list_object.py
+++ b/traits/trait_list_object.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -548,7 +548,8 @@ class TraitListObject(TraitList):
     trait : CTrait
         The trait that the list has been assigned to.
     object : HasTraits
-        The object the list belongs to.
+        The object this list belongs to. Can also be None in cases where the
+        list has been disconnected from its HasTraits parent.
     name : str
         The name of the trait on the object.
     value : iterable
@@ -558,8 +559,9 @@ class TraitListObject(TraitList):
     ----------
     trait : CTrait
         The trait that the list has been assigned to.
-    object : HasTraits
-        The object the list belongs to.
+    object : callable
+        A callable that when called with no arguments returns the HasTraits
+        object that this list belongs to, or None if there is no such object.
     name : str
         The name of the trait on the object.
     value : iterable
@@ -569,7 +571,7 @@ class TraitListObject(TraitList):
     def __init__(self, trait, object, name, value):
 
         self.trait = trait
-        self.object = ref(object)
+        self.object = (lambda: None) if object is None else ref(object)
         self.name = name
         self.name_items = None
         if trait.has_items:
@@ -812,7 +814,7 @@ class TraitListObject(TraitList):
         """
         return TraitListObject(
             self.trait,
-            lambda: None,
+            None,
             self.name,
             [copy.deepcopy(x, memo) for x in self],
         )
@@ -857,7 +859,7 @@ class TraitListObject(TraitList):
         if object is None:
             return value
 
-        trait_validator = self.trait.item_trait.handler.validate
+        trait_validator = self.trait.item_trait.validate
         if trait_validator is None:
             return value
 
diff --git a/traits/trait_notifiers.py b/traits/trait_notifiers.py
index bea9e01..7626cf9 100644
--- a/traits/trait_notifiers.py
+++ b/traits/trait_notifiers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/trait_numeric.py b/traits/trait_numeric.py
index c1574c6..79ab4be 100644
--- a/traits/trait_numeric.py
+++ b/traits/trait_numeric.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -416,7 +416,7 @@ class ArrayOrNone(CArray):
     """ A coercing trait whose value may be either a NumPy array or None.
 
     This trait is designed to avoid the comparison issues with numpy arrays
-    that can arise from the use of constructs like Either(None, Array).
+    that can arise from the use of constructs like Union(None, Array).
 
     The default value is None.
     """
diff --git a/traits/trait_set_object.py b/traits/trait_set_object.py
index 284ba95..9e5031b 100644
--- a/traits/trait_set_object.py
+++ b/traits/trait_set_object.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -451,7 +451,8 @@ class TraitSetObject(TraitSet):
     trait : CTrait
         The trait that the set has been assigned to.
     object : HasTraits
-        The object the set belongs to.
+        The object this set belongs to. Can also be None in cases where the
+        set has been disconnected from its HasTraits parent.
     name : str
         The name of the trait on the object.
     value : iterable
@@ -461,8 +462,9 @@ class TraitSetObject(TraitSet):
     ----------
     trait : CTrait
         The trait that the set has been assigned to.
-    object : HasTraits
-        The object the set belongs to.
+    object : callable
+        A callable that when called with no arguments returns the HasTraits
+        object that this set belongs to, or None if there is no such object.
     name : str
         The name of the trait on the object.
     value : iterable
@@ -472,7 +474,7 @@ class TraitSetObject(TraitSet):
     def __init__(self, trait, object, name, value):
 
         self.trait = trait
-        self.object = ref(object)
+        self.object = (lambda: None) if object is None else ref(object)
         self.name = name
         self.name_items = None
         if trait.has_items:
@@ -509,7 +511,7 @@ class TraitSetObject(TraitSet):
         object = object_ref()
 
         # validate the new value(s)
-        validate = trait.item_trait.handler.validate
+        validate = trait.item_trait.validate
 
         if validate is None:
             return value
@@ -560,7 +562,7 @@ class TraitSetObject(TraitSet):
 
         result = TraitSetObject(
             self.trait,
-            lambda: None,
+            None,
             self.name,
             {copy.deepcopy(x, memo) for x in self},
         )
diff --git a/traits/trait_type.py b/traits/trait_type.py
index ac5ba23..ea72808 100644
--- a/traits/trait_type.py
+++ b/traits/trait_type.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -16,6 +16,7 @@ traits, and provides a richer API than the old-style traits derived from
 ``TraitHandler``.
 """
 
+import logging
 import warnings
 
 from .base_trait_handler import BaseTraitHandler
@@ -26,10 +27,34 @@ from .trait_errors import TraitError
 from .trait_list_object import TraitListObject
 from .trait_set_object import TraitSetObject
 
+#: Logger instance for this module
+logger = logging.getLogger(__name__)
 
 #: Mapping from trait metadata 'type' to CTrait 'type':
 trait_types = {"python": 1, "event": 2}
 
+#: DefaultValue kinds that have to copy a new default value when cloned
+clone_copies_default_value = {
+    DefaultValue.trait_list_object,
+    DefaultValue.trait_dict_object,
+    DefaultValue.trait_set_object,
+}
+
+#: DefaultValue types that become constant type when given a new default
+clone_becomes_constant_default_value = {
+    DefaultValue.callable_and_args,
+    DefaultValue.callable,
+    DefaultValue.object,
+    # the following are being phased out
+    DefaultValue.list_copy,
+    DefaultValue.dict_copy,
+}
+
+#: DefaultValue types that cannot take a default value when cloned
+clone_no_override_default_value = {
+    DefaultValue.disallow,
+}
+
 
 def _infer_default_value_type(default_value):
     """ Figure out the default value type given a default value.
@@ -305,14 +330,46 @@ class TraitType(BaseTraitHandler):
         new._metadata.update(metadata)
 
         if default_value is not NoDefaultSpecified:
-            new.default_value = default_value
-            if self.validate is not None:
+            if new.default_value_type in clone_no_override_default_value:
+                raise TraitError(
+                    f"Can't override default value of cloned {new} trait",
+                )
+
+            # does the trait want the original value as the default?
+            # TODO: since this is needed here, it should also be a property of
+            # the TraitType, not just the CTrait.
+            # xref: enthought/traits#1695
+            setattr_original_value = new.as_ctrait().setattr_original_value
+
+            # try to validate the new default value
+            if not (self.validate is None or setattr_original_value):
                 try:
-                    new.default_value = self.validate(
-                        None, None, default_value
+                    default_value = self.validate(None, None, default_value)
+                except Exception as exc:
+                    # this is expected for traits which need object or name
+                    # information to properly validate (eg. This() trait)
+                    # TODO: override This.clone() and similar for better
+                    # behaviour and raise an exception here.
+                    # xref: enthought/traits#1696
+                    logger.debug(
+                        f"Validation failed cloning {self} with "
+                        f"default value {default_value}: {exc}",
+                        exc_info=True,
                     )
-                except Exception:
-                    pass
+
+            if new.default_value_type in clone_copies_default_value:
+                default_value = default_value.copy()
+
+            if new.default_value_type in clone_becomes_constant_default_value:
+                # Note that a mutable default value will be shared across
+                # instances; this may not always be the desired behaviour,
+                # especially for trait types using a callable_and_args default.
+                # TraitType subclasses that need a different behaviour should
+                # override or extend the clone() method.
+                # xref: enthought/traits#1630
+                new.default_value_type = DefaultValue.constant
+
+            new.default_value = default_value
 
         return new
 
diff --git a/traits/trait_types.py b/traits/trait_types.py
index aa659eb..63d402f 100644
--- a/traits/trait_types.py
+++ b/traits/trait_types.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -24,6 +24,7 @@ import uuid
 import warnings
 
 from .constants import DefaultValue, TraitKind, ValidateTrait
+from .ctraits import _validate_complex_number, _validate_float
 from .trait_base import (
     strx,
     get_module_name,
@@ -94,35 +95,13 @@ SetTypes = SequenceTypes + (set,)
 
 try:
     # The numpy enhanced definitions:
-    from numpy import integer, floating, complexfloating, bool_
-
-    int_fast_validate = (ValidateTrait.coerce, int, integer)
-    float_fast_validate = (
-        ValidateTrait.coerce,
-        float,
-        floating,
-        None,
-        int,
-        integer,
-    )
-    complex_fast_validate = (
-        ValidateTrait.coerce,
-        complex,
-        complexfloating,
-        None,
-        float,
-        floating,
-        int,
-        integer,
-    )
+    from numpy import bool_
+
     bool_fast_validate = (ValidateTrait.coerce, bool, None, bool_)
     # Tuple or single type suitable for an isinstance check.
     _BOOL_TYPES = (bool, bool_)
 except ImportError:
     # The standard python definitions (without numpy):
-    int_fast_validate = (ValidateTrait.coerce, int)
-    float_fast_validate = (ValidateTrait.coerce, float, None, int)
-    complex_fast_validate = (ValidateTrait.coerce, complex, None, float, int)
     bool_fast_validate = (ValidateTrait.coerce, bool)
     # Tuple or single type suitable for an isinstance check.
     _BOOL_TYPES = bool
@@ -169,20 +148,6 @@ def _validate_int(value):
         return int(operator.index(value))
 
 
-def _validate_float(value):
-    """ Convert an arbitrary Python object to a float, or raise TypeError.
-    """
-    if type(value) is float:  # fast path for common case
-        return value
-    try:
-        nb_float = type(value).__float__
-    except AttributeError:
-        raise TypeError(
-            "Object of type {!r} not convertible to float".format(type(value))
-        )
-    return nb_float(value)
-
-
 # Trait Types
 
 class Any(TraitType):
@@ -387,13 +352,10 @@ class BaseComplex(TraitType):
 
         Note: The 'fast validator' version performs this check in C.
         """
-        if isinstance(value, complex):
-            return value
-
-        if isinstance(value, (float, int)):
-            return complex(value)
-
-        self.error(object, name, value)
+        try:
+            return _validate_complex_number(value)
+        except TypeError:
+            self.error(object, name, value)
 
     def create_editor(self):
         """ Returns the default traits UI editor for this type of trait.
@@ -409,7 +371,7 @@ class Complex(BaseComplex):
     """
 
     #: The C-level fast validator to use:
-    fast_validate = complex_fast_validate
+    fast_validate = (ValidateTrait.complex_number,)
 
 
 class BaseStr(TraitType):
@@ -2539,8 +2501,42 @@ class Tuple(BaseTuple):
         """
         super().init_fast_validate(*args)
 
+        # Don't set fast validation in the no-type-check case; we need
+        # Python-level handling so that we can issue a deprecation warning
+        # for the case of validating a list.
+        # xref: enthought/traits#1626
+        if self.no_type_check:
+            return
+
         self.fast_validate = args
 
+    def validate(self, object, name, value):
+        """ Validates that the value is a valid tuple.
+        """
+        if self.no_type_check:
+            if isinstance(value, tuple):
+                return value
+            elif isinstance(value, list):
+                warnings.warn(
+                    "In the future, lists will no longer be accepted by "
+                    "the Tuple trait type. Lists should be converted to "
+                    "tuples prior to validation.",
+                    DeprecationWarning,
+                    stacklevel=2,
+                )
+                return tuple(value)
+
+        elif isinstance(value, tuple) and len(value) == len(self.types):
+            try:
+                return tuple(
+                    type.validate(object, name, item_value)
+                    for type, item_value in zip(self.types, value)
+                )
+            except TraitError:
+                pass
+
+        self.error(object, name, value)
+
 
 class ValidatedTuple(BaseTuple):
     """ A trait type holding a tuple with customized validation.
@@ -3081,6 +3077,8 @@ class Dict(TraitType):
         if (handler is not None) and handler.has_items:
             handler = handler.clone()
             handler.has_items = False
+        # This attribute isn't actually used for anything, but we keep it
+        # for backwards compatibility.
         self.value_handler = handler
 
         super().__init__(value, **metadata)
@@ -4126,6 +4124,13 @@ class ToolbarButton(Button):
 class Either(TraitType):
     """ A trait type whose value can be any of of a specified list of traits.
 
+    .. note::
+
+        This class has some unusual corner-case behaviours and is not
+        recommended for use in new code. It may eventually be deprecated and
+        removed. For new code, consider using the :class:`~.Union` trait type
+        instead.
+
     Parameters
     ----------
     *traits
diff --git a/traits/traits.py b/traits/traits.py
index ff33489..cd0692f 100644
--- a/traits/traits.py
+++ b/traits/traits.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -148,6 +148,12 @@ class Default(object):
 def Trait(*value_type, **metadata):
     """ Creates a trait definition.
 
+    .. note::
+
+       The :func:`~.Trait` function is not recommended for use in new code,
+       and may eventually be deprecated and removed. Consider using
+       :class:`~.Union` instead.
+
     This function accepts a variety of forms of parameter lists:
 
     +-------------------+---------------+-------------------------------------+
diff --git a/traits/traits_listener.py b/traits/traits_listener.py
index 34d39d8..e07d897 100644
--- a/traits/traits_listener.py
+++ b/traits/traits_listener.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/__init__.py b/traits/util/__init__.py
index 45e0018..612fa82 100644
--- a/traits/util/__init__.py
+++ b/traits/util/__init__.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/_traitsui_helpers.py b/traits/util/_traitsui_helpers.py
index 31ed0a8..6d5066f 100644
--- a/traits/util/_traitsui_helpers.py
+++ b/traits/util/_traitsui_helpers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/api.py b/traits/util/api.py
index 454bc29..812e525 100644
--- a/traits/util/api.py
+++ b/traits/util/api.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/async_trait_wait.py b/traits/util/async_trait_wait.py
index 9ce08fd..0cafdd6 100644
--- a/traits/util/async_trait_wait.py
+++ b/traits/util/async_trait_wait.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/camel_case.py b/traits/util/camel_case.py
index 8bfc11c..b45e69b 100644
--- a/traits/util/camel_case.py
+++ b/traits/util/camel_case.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/clean_strings.py b/traits/util/clean_strings.py
index 61d50ec..c137d83 100644
--- a/traits/util/clean_strings.py
+++ b/traits/util/clean_strings.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/deprecated.py b/traits/util/deprecated.py
index 8016800..a2c221e 100644
--- a/traits/util/deprecated.py
+++ b/traits/util/deprecated.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/event_tracer.py b/traits/util/event_tracer.py
index 05e7dcf..f4c1ee7 100644
--- a/traits/util/event_tracer.py
+++ b/traits/util/event_tracer.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/home_directory.py b/traits/util/home_directory.py
index 26de9ba..44aaff7 100644
--- a/traits/util/home_directory.py
+++ b/traits/util/home_directory.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/import_symbol.py b/traits/util/import_symbol.py
index de69fb6..7cbf305 100644
--- a/traits/util/import_symbol.py
+++ b/traits/util/import_symbol.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/resource.py b/traits/util/resource.py
index d13d5bf..77559c2 100644
--- a/traits/util/resource.py
+++ b/traits/util/resource.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/tests/test_async_trait_wait.py b/traits/util/tests/test_async_trait_wait.py
index 314dec7..6c38227 100644
--- a/traits/util/tests/test_async_trait_wait.py
+++ b/traits/util/tests/test_async_trait_wait.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/tests/test_camel_case.py b/traits/util/tests/test_camel_case.py
index 84ae5b8..b6d4c33 100644
--- a/traits/util/tests/test_camel_case.py
+++ b/traits/util/tests/test_camel_case.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/tests/test_clean_strings.py b/traits/util/tests/test_clean_strings.py
index c2ba8f2..d9f9fd2 100644
--- a/traits/util/tests/test_clean_strings.py
+++ b/traits/util/tests/test_clean_strings.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/tests/test_deprecated.py b/traits/util/tests/test_deprecated.py
index 5180480..2e27a48 100644
--- a/traits/util/tests/test_deprecated.py
+++ b/traits/util/tests/test_deprecated.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/tests/test_import_symbol.py b/traits/util/tests/test_import_symbol.py
index 73f3da4..2224596 100644
--- a/traits/util/tests/test_import_symbol.py
+++ b/traits/util/tests/test_import_symbol.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/tests/test_message_records.py b/traits/util/tests/test_message_records.py
index 654cec8..f015bf3 100644
--- a/traits/util/tests/test_message_records.py
+++ b/traits/util/tests/test_message_records.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/tests/test_record_containers.py b/traits/util/tests/test_record_containers.py
index 5e4163b..0842945 100644
--- a/traits/util/tests/test_record_containers.py
+++ b/traits/util/tests/test_record_containers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/tests/test_record_events.py b/traits/util/tests/test_record_events.py
index b38e204..9bf575d 100644
--- a/traits/util/tests/test_record_events.py
+++ b/traits/util/tests/test_record_events.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -25,7 +25,7 @@ from traits.util.event_tracer import (
 )
 
 
-class TestObject(HasTraits):
+class ExampleObject(HasTraits):
 
     number = Float(2.0)
     list_of_numbers = List(Float())
@@ -47,7 +47,7 @@ class TestRecordEvents(unittest.TestCase):
         shutil.rmtree(self.directory)
 
     def test_change_event_recorder(self):
-        test_object = TestObject()
+        test_object = ExampleObject()
         container = RecordContainer()
         recorder = ChangeEventRecorder(container=container)
         trait_notifiers.set_change_event_tracers(
@@ -65,14 +65,14 @@ class TestRecordEvents(unittest.TestCase):
             self.assertEqual(len(lines), 4)
             # very basic checking
             self.assertTrue(
-                "-> 'number' changed from 2.0 to 5.0 in 'TestObject'\n"
+                "-> 'number' changed from 2.0 to 5.0 in 'ExampleObject'\n"
                 in lines[0]
             )
             self.assertTrue("CALLING" in lines[1])
             self.assertTrue("EXIT" in lines[2])
 
     def test_multi_thread_change_event_recorder(self):
-        test_object = TestObject()
+        test_object = ExampleObject()
         container = MultiThreadRecordContainer()
         recorder = MultiThreadChangeEventRecorder(container=container)
         trait_notifiers.set_change_event_tracers(
@@ -99,19 +99,19 @@ class TestRecordEvents(unittest.TestCase):
             # very basic checking
             if "MainThread.trace" in filename:
                 self.assertTrue(
-                    "-> 'number' changed from 2.0 to 5.0 in 'TestObject'\n"
+                    "-> 'number' changed from 2.0 to 5.0 in 'ExampleObject'\n"
                     in lines[0]
                 )
             else:
                 self.assertTrue(
-                    "-> 'number' changed from 5.0 to 10.0 in 'TestObject'\n"
+                    "-> 'number' changed from 5.0 to 10.0 in 'ExampleObject'\n"
                     in lines[0]
                 )
             self.assertTrue("CALLING" in lines[1])
             self.assertTrue("EXIT" in lines[2])
 
     def test_record_events(self):
-        test_object = TestObject()
+        test_object = ExampleObject()
         with record_events() as container:
             test_object.number = 5.0
             thread = threading.Thread(
@@ -130,12 +130,12 @@ class TestRecordEvents(unittest.TestCase):
             # very basic checking
             if "MainThread.trace" in filename:
                 self.assertTrue(
-                    "-> 'number' changed from 2.0 to 5.0 in 'TestObject'\n"
+                    "-> 'number' changed from 2.0 to 5.0 in 'ExampleObject'\n"
                     in lines[0]
                 )
             else:
                 self.assertTrue(
-                    "-> 'number' changed from 5.0 to 8.0 in 'TestObject'\n"
+                    "-> 'number' changed from 5.0 to 8.0 in 'ExampleObject'\n"
                     in lines[0]
                 )
             self.assertTrue("CALLING" in lines[1])
diff --git a/traits/util/tests/test_resource.py b/traits/util/tests/test_resource.py
index fbd126c..beb161a 100644
--- a/traits/util/tests/test_resource.py
+++ b/traits/util/tests/test_resource.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
@@ -14,9 +14,11 @@ import os
 import tempfile
 import unittest
 
+from traits.testing.optional_dependencies import requires_pkg_resources
 from traits.util.resource import find_resource, store_resource
 
 
+@requires_pkg_resources
 class TestResource(unittest.TestCase):
     def test_find_resource_deprecated(self):
         with self.assertWarns(DeprecationWarning):
diff --git a/traits/util/tests/test_trait_documenter.py b/traits/util/tests/test_trait_documenter.py
index 32f640c..81ac738 100644
--- a/traits/util/tests/test_trait_documenter.py
+++ b/traits/util/tests/test_trait_documenter.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/tests/test_traitsui_helpers.py b/traits/util/tests/test_traitsui_helpers.py
index 78568f7..617f059 100644
--- a/traits/util/tests/test_traitsui_helpers.py
+++ b/traits/util/tests/test_traitsui_helpers.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/tests/test_weakidddict.py b/traits/util/tests/test_weakidddict.py
index 048dc47..b710e49 100644
--- a/traits/util/tests/test_weakidddict.py
+++ b/traits/util/tests/test_weakidddict.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/toposort.py b/traits/util/toposort.py
index 970ae77..47cacf9 100644
--- a/traits/util/toposort.py
+++ b/traits/util/toposort.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/trait_documenter.py b/traits/util/trait_documenter.py
index 530161b..b9cb7ef 100644
--- a/traits/util/trait_documenter.py
+++ b/traits/util/trait_documenter.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD
diff --git a/traits/util/weakiddict.py b/traits/util/weakiddict.py
index a10a8b8..05fa993 100644
--- a/traits/util/weakiddict.py
+++ b/traits/util/weakiddict.py
@@ -1,4 +1,4 @@
-# (C) Copyright 2005-2021 Enthought, Inc., Austin, TX
+# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
 # All rights reserved.
 #
 # This software is provided without warranty under the terms of the BSD

More details

Full run details