diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8003d10f072dff66e2fc91aabb58ff49c3e25b7c..2ef094a7643dff76ba865139abc4b075a09c1816 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -251,52 +251,6 @@ stages:
   - |-
     python -m pytest --verbose -p pytester -p no:doctest --xdoctest --cov-config ../pyproject.toml --cov-report term --durations=100 --cov="$MOD_NAME" "$MOD_DPATH" ../tests
   - echo "pytest command finished, moving the coverage file to the repo root"
-build/cp36-linux-x86_64:
-  <<: *build_template
-  image: python:3.6
-test/minimal-loose/cp36-linux-x86_64:
-  <<: *test_minimal-loose_template
-  image: python:3.6
-  needs:
-  - build/cp36-linux-x86_64
-test/full-loose/cp36-linux-x86_64:
-  <<: *test_full-loose_template
-  image: python:3.6
-  needs:
-  - build/cp36-linux-x86_64
-test/minimal-strict/cp36-linux-x86_64:
-  <<: *test_minimal-strict_template
-  image: python:3.6
-  needs:
-  - build/cp36-linux-x86_64
-test/full-strict/cp36-linux-x86_64:
-  <<: *test_full-strict_template
-  image: python:3.6
-  needs:
-  - build/cp36-linux-x86_64
-build/cp37-linux-x86_64:
-  <<: *build_template
-  image: python:3.7
-test/minimal-loose/cp37-linux-x86_64:
-  <<: *test_minimal-loose_template
-  image: python:3.7
-  needs:
-  - build/cp37-linux-x86_64
-test/full-loose/cp37-linux-x86_64:
-  <<: *test_full-loose_template
-  image: python:3.7
-  needs:
-  - build/cp37-linux-x86_64
-test/minimal-strict/cp37-linux-x86_64:
-  <<: *test_minimal-strict_template
-  image: python:3.7
-  needs:
-  - build/cp37-linux-x86_64
-test/full-strict/cp37-linux-x86_64:
-  <<: *test_full-strict_template
-  image: python:3.7
-  needs:
-  - build/cp37-linux-x86_64
 build/cp38-linux-x86_64:
   <<: *build_template
   image: python:3.8
@@ -440,10 +394,6 @@ gpgsign/wheels:
     - main
     - release
   needs:
-  - job: build/cp36-linux-x86_64
-    artifacts: true
-  - job: build/cp37-linux-x86_64
-    artifacts: true
   - job: build/cp38-linux-x86_64
     artifacts: true
   - job: build/cp39-linux-x86_64
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5251b18da7cadb7ae8679bdb17b6ae052b79121e..429df7f9eb6e1ada153aa7dd843b65c1d8541715 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,11 @@ This changelog follows the specifications detailed in: [Keep a Changelog](https:
 This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), although we have not yet reached a `1.0.0` release.
 
 
-## Version 0.7.16 - Unreleased
+## Version 0.8.0 - Unreleased
+
+### Removed
+
+* Remove 3.6 and 3.7 support
 
 
 ## Version 0.7.15 - Released 2024-05-13
diff --git a/pyproject.toml b/pyproject.toml
index 08edd03496f2a32ee920d811cc03511eb74dd8ad..10a58fcc30a0bbf33ef239786bd08f04ca654a08 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -12,7 +12,8 @@ repo_name = "scriptconfig"
 rel_mod_parent_dpath = "."
 os = [ "osx", "linux", "win", "all",]
 url = "https://gitlab.kitware.com/utils/scriptconfig"
-min_python = 3.6
+min_python = 3.8
+max_python = 3.12
 version = "{mod_dpath}/__init__.py::__version__"
 author = "Kitware Inc., Jon Crall"
 author_email = "kitware@kitware.com, jon.crall@kitware.com"
diff --git a/requirements/runtime.txt b/requirements/runtime.txt
index 9c3a1d0e8e1f7272761be4d922e70408d784a9f7..2a8d324c818a499fbe3b46117c3775750c970f63 100644
--- a/requirements/runtime.txt
+++ b/requirements/runtime.txt
@@ -1,4 +1,4 @@
-ubelt>=1.2.3
+ubelt>=1.3.6
 
 PyYAML>=6.0.1     ; python_version < '4.0'  and python_version >= '3.12'    # Python 3.12+
 PyYAML>=6.0       ; python_version < '3.12' and python_version >= '3.11'    # Python 3.11+
diff --git a/requirements/tests.txt b/requirements/tests.txt
index 76f07e4bd22c1814274852f50c9229773622c794..382d28a1d2c9f54ec2251e567e9ac8ca6516f175 100644
--- a/requirements/tests.txt
+++ b/requirements/tests.txt
@@ -20,4 +20,4 @@ pytest-cov>=2.9.0           ; python_version < '3.6.0'  and python_version >= '3
 pytest-cov>=2.8.1           ; python_version < '3.5.0'  and python_version >= '3.4.0'   # Python 3.4
 pytest-cov>=2.8.1           ; python_version < '2.8.0'  and python_version >= '2.7.0'   # Python 2.7
 
-xdoctest >= 1.1.3
+xdoctest >= 1.1.5
diff --git a/scriptconfig/__init__.py b/scriptconfig/__init__.py
index 333d50639efa190b0bb33d1fb391f0014346aa46..e156610f5bc559e8cc711302a0a8b379ef51f6cf 100644
--- a/scriptconfig/__init__.py
+++ b/scriptconfig/__init__.py
@@ -151,7 +151,7 @@ Ignore:
     mkinit ~/code/scriptconfig/scriptconfig/__init__.py --nomods --relative -w
 """
 
-__version__ = '0.7.16'
+__version__ = '0.8.0'
 
 __submodules__ = {
     'modal': None,
diff --git a/scriptconfig/config.py b/scriptconfig/config.py
index 56c78618f4f7f479589470323e726f6f0850ed57..a1fe7e3f7b30d3987522abd081f16aee94ae1102 100644
--- a/scriptconfig/config.py
+++ b/scriptconfig/config.py
@@ -180,7 +180,7 @@ class MetaConfig(type):
             ub.schedule_deprecation(
                 'scriptconfig', 'default', f'class attribute of {name}',
                 migration='Use __default__ instead',
-                deprecate='0.7.6', error='0.8.0', remove='0.9.0',
+                deprecate='0.7.6', error='0.10.0', remove='1.0.0',
             )
 
         HANDLE_INHERITENCE = 1
@@ -212,7 +212,7 @@ class MetaConfig(type):
             ub.schedule_deprecation(
                 'scriptconfig', 'normalize', f'class attribute of {name}',
                 migration='Use __post_init__ instead',
-                deprecate='0.7.6', error='0.8.0', remove='0.9.0',
+                deprecate='0.7.6', error='0.10.0', remove='1.0.0',
             )
 
         if '__post_init__' in namespace and 'normalize' not in namespace:
@@ -756,7 +756,7 @@ class Config(ub.NiceRepr, DictLike, metaclass=MetaConfig):
             if isinstance(cmdline, dict):
                 ub.schedule_deprecation('scriptconfig', 'cmdline', 'parameter as a dictionary',
                                         migration='The API should expose any special params explicitly',
-                                        deprecate='0.7.15', error='0.8.0', remove='0.9.0')
+                                        deprecate='0.7.15', error='0.10.0', remove='1.0.0')
                 read_argv_kwargs.update(cmdline)
             elif ub.iterable(cmdline) or isinstance(cmdline, str):
                 read_argv_kwargs['argv'] = cmdline
@@ -1089,7 +1089,7 @@ class Config(ub.NiceRepr, DictLike, metaclass=MetaConfig):
             ub.schedule_deprecation(
                 'scriptconfig', 'description', 'attribute of Config classes',
                 migration='Use __description__ or the docstring instead',
-                deprecate='0.7.11', error='0.8.0', remove='0.9.0')
+                deprecate='0.7.11', error='0.10.0', remove='1.0.0')
 
         description = getattr(self, '__description__',
                               getattr(self, 'description', None))
@@ -1108,7 +1108,7 @@ class Config(ub.NiceRepr, DictLike, metaclass=MetaConfig):
             ub.schedule_deprecation(
                 'scriptconfig', 'epilog', 'attribute of Config classes',
                 migration='Use __epilog__ instead',
-                deprecate='0.7.11', error='0.8.0', remove='0.9.0')
+                deprecate='0.7.11', error='0.10.0', remove='1.0.0')
 
         epilog = getattr(self, '__epilog__', getattr(self, 'epilog', None))
         if epilog is not None:
@@ -1121,7 +1121,7 @@ class Config(ub.NiceRepr, DictLike, metaclass=MetaConfig):
             ub.schedule_deprecation(
                 'scriptconfig', 'prog', 'attribute of Config classes',
                 migration='Use __prog__ instead',
-                deprecate='0.7.11', error='0.8.0', remove='0.9.0')
+                deprecate='0.7.11', error='0.10.0', remove='1.0.0')
         prog = getattr(self, '__prog__', getattr(self, 'prog', None))
         if prog is None:
             prog = self.__class__.__name__