diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 020e86206..62f311f4c 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -61,10 +61,11 @@ body:
       label: Python Version
       options:
         - "lower version (unsupported)"
-        - "3.8"
         - "3.9"
         - "3.10"
         - "3.11"
+        - "3.12"
+        - "3.13"
     validations:
       required: true
   - type: textarea
diff --git a/.github/workflows/deploy_release.yml b/.github/workflows/deploy_release.yml
index 2f6cb8619..fff052fbf 100644
--- a/.github/workflows/deploy_release.yml
+++ b/.github/workflows/deploy_release.yml
@@ -18,7 +18,7 @@ jobs:
       - name: Set up Python
         uses: actions/setup-python@v5
         with:
-          python-version: '3.12'
+          python-version: '3.13'
 
       - name: Install build dependencies
         run: |
diff --git a/.github/workflows/run_all_tests.yml b/.github/workflows/run_all_tests.yml
index a1b1f75dd..7ce28b686 100644
--- a/.github/workflows/run_all_tests.yml
+++ b/.github/workflows/run_all_tests.yml
@@ -22,31 +22,30 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - { name: linux-python3.8-minimum      , test-tox-env: py38-minimum    , build-tox-env: build-py38-minimum    , python-ver: "3.8" , os: ubuntu-latest }
-          - { name: linux-python3.9              , test-tox-env: py39            , build-tox-env: build-py39            , python-ver: "3.9" , os: ubuntu-latest }
-          - { name: linux-python3.10             , test-tox-env: py310           , build-tox-env: build-py310           , python-ver: "3.10", os: ubuntu-latest }
-          - { name: linux-python3.11             , test-tox-env: py311           , build-tox-env: build-py311           , python-ver: "3.11", os: ubuntu-latest }
-          - { name: linux-python3.11-opt         , test-tox-env: py311-optional  , build-tox-env: build-py311           , python-ver: "3.11", os: ubuntu-latest }
-          - { name: linux-python3.12             , test-tox-env: py312           , build-tox-env: build-py312           , python-ver: "3.12", os: ubuntu-latest }
-          - { name: linux-python3.12-upgraded    , test-tox-env: py312-upgraded  , build-tox-env: build-py312-upgraded  , python-ver: "3.12", os: ubuntu-latest }
-          - { name: linux-python3.12-prerelease  , test-tox-env: py312-prerelease, build-tox-env: build-py312-prerelease, python-ver: "3.12", os: ubuntu-latest }
-          - { name: windows-python3.8-minimum    , test-tox-env: py38-minimum    , build-tox-env: build-py38-minimum    , python-ver: "3.8" , os: windows-latest }
-          - { name: windows-python3.9            , test-tox-env: py39            , build-tox-env: build-py39            , python-ver: "3.9" , os: windows-latest }
-          - { name: windows-python3.10           , test-tox-env: py310           , build-tox-env: build-py310           , python-ver: "3.10", os: windows-latest }
-          - { name: windows-python3.11           , test-tox-env: py311           , build-tox-env: build-py311           , python-ver: "3.11", os: windows-latest }
-          - { name: windows-python3.11-opt       , test-tox-env: py311-optional  , build-tox-env: build-py311           , python-ver: "3.11", os: windows-latest }
-          - { name: windows-python3.12           , test-tox-env: py312           , build-tox-env: build-py312           , python-ver: "3.12", os: windows-latest }
-          - { name: windows-python3.12-upgraded  , test-tox-env: py312-upgraded  , build-tox-env: build-py312-upgraded  , python-ver: "3.12", os: windows-latest }
-          - { name: windows-python3.12-prerelease, test-tox-env: py312-prerelease, build-tox-env: build-py312-prerelease, python-ver: "3.11", os: windows-latest }
-          # minimum versions of dependencies do not have wheels or cannot be built on macos-arm64
-          - { name: macos-python3.8-minimum      , test-tox-env: py38-minimum    , build-tox-env: build-py38-minimum    , python-ver: "3.8" , os: macos-13 }
-          - { name: macos-python3.9              , test-tox-env: py39            , build-tox-env: build-py39            , python-ver: "3.9" , os: macos-latest }
-          - { name: macos-python3.10             , test-tox-env: py310           , build-tox-env: build-py310           , python-ver: "3.10", os: macos-latest }
-          - { name: macos-python3.11             , test-tox-env: py311           , build-tox-env: build-py311           , python-ver: "3.11", os: macos-latest }
-          - { name: macos-python3.11-opt         , test-tox-env: py311-optional  , build-tox-env: build-py311           , python-ver: "3.11", os: macos-latest }
-          - { name: macos-python3.12             , test-tox-env: py312           , build-tox-env: build-py312           , python-ver: "3.12", os: macos-latest }
-          - { name: macos-python3.12-upgraded    , test-tox-env: py312-upgraded  , build-tox-env: build-py312-upgraded  , python-ver: "3.12", os: macos-latest }
-          - { name: macos-python3.12-prerelease  , test-tox-env: py312-prerelease, build-tox-env: build-py312-prerelease, python-ver: "3.12", os: macos-latest }
+          - { name: linux-python3.9-minimum      , test-tox-env: test-py39-minimum    , build-tox-env: build-py39-minimum    , python-ver: "3.9" , os: ubuntu-latest }
+          - { name: linux-python3.10             , test-tox-env: test-py310           , build-tox-env: build-py310           , python-ver: "3.10", os: ubuntu-latest }
+          - { name: linux-python3.11             , test-tox-env: test-py311           , build-tox-env: build-py311           , python-ver: "3.11", os: ubuntu-latest }
+          - { name: linux-python3.11-opt         , test-tox-env: test-py311-optional  , build-tox-env: build-py311           , python-ver: "3.11", os: ubuntu-latest }
+          - { name: linux-python3.12             , test-tox-env: test-py312           , build-tox-env: build-py312           , python-ver: "3.12", os: ubuntu-latest }
+          - { name: linux-python3.13             , test-tox-env: test-py313           , build-tox-env: build-py313           , python-ver: "3.13", os: ubuntu-latest }
+          - { name: linux-python3.13-upgraded    , test-tox-env: test-py313-upgraded  , build-tox-env: build-py313-upgraded  , python-ver: "3.13", os: ubuntu-latest }
+          - { name: linux-python3.13-prerelease  , test-tox-env: test-py313-prerelease, build-tox-env: build-py313-prerelease, python-ver: "3.13", os: ubuntu-latest }
+          - { name: windows-python3.9-minimum    , test-tox-env: test-py39-minimum    , build-tox-env: build-py39-minimum    , python-ver: "3.9" , os: windows-latest }
+          - { name: windows-python3.10           , test-tox-env: test-py310           , build-tox-env: build-py310           , python-ver: "3.10", os: windows-latest }
+          - { name: windows-python3.11           , test-tox-env: test-py311           , build-tox-env: build-py311           , python-ver: "3.11", os: windows-latest }
+          - { name: windows-python3.11-opt       , test-tox-env: test-py311-optional  , build-tox-env: build-py311           , python-ver: "3.11", os: windows-latest }
+          - { name: windows-python3.12           , test-tox-env: test-py312           , build-tox-env: build-py312           , python-ver: "3.12", os: windows-latest }
+          - { name: windows-python3.13           , test-tox-env: test-py313           , build-tox-env: build-py313           , python-ver: "3.13", os: windows-latest }
+          - { name: windows-python3.13-upgraded  , test-tox-env: test-py313-upgraded  , build-tox-env: build-py313-upgraded  , python-ver: "3.13", os: windows-latest }
+          - { name: windows-python3.13-prerelease, test-tox-env: test-py313-prerelease, build-tox-env: build-py313-prerelease, python-ver: "3.13", os: windows-latest }
+          - { name: macos-python3.9-minimum      , test-tox-env: test-py39-minimum    , build-tox-env: build-py39-minimum    , python-ver: "3.9" , os: macos-13 }
+          - { name: macos-python3.10             , test-tox-env: test-py310           , build-tox-env: build-py310           , python-ver: "3.10", os: macos-latest }
+          - { name: macos-python3.11             , test-tox-env: test-py311           , build-tox-env: build-py311           , python-ver: "3.11", os: macos-latest }
+          - { name: macos-python3.11-opt         , test-tox-env: test-py311-optional  , build-tox-env: build-py311           , python-ver: "3.11", os: macos-latest }
+          - { name: macos-python3.12             , test-tox-env: test-py312           , build-tox-env: build-py312           , python-ver: "3.12", os: macos-latest }
+          - { name: macos-python3.13             , test-tox-env: test-py313           , build-tox-env: build-py313           , python-ver: "3.13", os: macos-latest }
+          - { name: macos-python3.13-upgraded    , test-tox-env: test-py313-upgraded  , build-tox-env: build-py313-upgraded  , python-ver: "3.13", os: macos-latest }
+          - { name: macos-python3.13-prerelease  , test-tox-env: test-py313-prerelease, build-tox-env: build-py313-prerelease, python-ver: "3.13", os: macos-latest }
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
@@ -93,16 +92,15 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - { name: linux-gallery-python3.8-minimum      , test-tox-env: gallery-py38-minimum    , python-ver: "3.8" , os: ubuntu-latest }
-          - { name: linux-gallery-python3.12-upgraded    , test-tox-env: gallery-py312-upgraded  , python-ver: "3.12", os: ubuntu-latest }
-          - { name: linux-gallery-python3.12-prerelease  , test-tox-env: gallery-py312-prerelease, python-ver: "3.12", os: ubuntu-latest }
-          - { name: windows-gallery-python3.8-minimum    , test-tox-env: gallery-py38-minimum    , python-ver: "3.8" , os: windows-latest }
-          - { name: windows-gallery-python3.12-upgraded  , test-tox-env: gallery-py312-upgraded  , python-ver: "3.12", os: windows-latest }
-          - { name: windows-gallery-python3.12-prerelease, test-tox-env: gallery-py312-prerelease, python-ver: "3.12", os: windows-latest }
-          # minimum versions of dependencies do not have wheels or cannot be built on macos-arm64
-          - { name: macos-gallery-python3.8-minimum      , test-tox-env: gallery-py38-minimum    , python-ver: "3.8" , os: macos-13 }
-          - { name: macos-gallery-python3.12-upgraded    , test-tox-env: gallery-py312-upgraded  , python-ver: "3.12", os: macos-latest }
-          - { name: macos-gallery-python3.12-prerelease  , test-tox-env: gallery-py312-prerelease, python-ver: "3.12", os: macos-latest }
+          - { name: linux-gallery-python3.9-minimum      , test-tox-env: gallery-py39-minimum    , python-ver: "3.9" , os: ubuntu-latest }
+          - { name: linux-gallery-python3.13-upgraded    , test-tox-env: gallery-py313-upgraded  , python-ver: "3.13", os: ubuntu-latest }
+          - { name: linux-gallery-python3.13-prerelease  , test-tox-env: gallery-py313-prerelease, python-ver: "3.13", os: ubuntu-latest }
+          - { name: windows-gallery-python3.9-minimum    , test-tox-env: gallery-py39-minimum    , python-ver: "3.9" , os: windows-latest }
+          - { name: windows-gallery-python3.13-upgraded  , test-tox-env: gallery-py313-upgraded  , python-ver: "3.13", os: windows-latest }
+          - { name: windows-gallery-python3.13-prerelease, test-tox-env: gallery-py313-prerelease, python-ver: "3.13", os: windows-latest }
+          - { name: macos-gallery-python3.9-minimum      , test-tox-env: gallery-py39-minimum    , python-ver: "3.9" , os: macos-13 }
+          - { name: macos-gallery-python3.13-upgraded    , test-tox-env: gallery-py313-upgraded  , python-ver: "3.13", os: macos-latest }
+          - { name: macos-gallery-python3.13-prerelease  , test-tox-env: gallery-py313-prerelease, python-ver: "3.13", os: macos-latest }
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
@@ -140,13 +138,13 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - { name: conda-linux-python3.8-minimum    , test-tox-env: py38-minimum    , build-tox-env: build-py38-minimum    , python-ver: "3.8" , os: ubuntu-latest }
-          - { name: conda-linux-python3.9            , test-tox-env: py39            , build-tox-env: build-py39            , python-ver: "3.9" , os: ubuntu-latest }
-          - { name: conda-linux-python3.10           , test-tox-env: py310           , build-tox-env: build-py310           , python-ver: "3.10", os: ubuntu-latest }
-          - { name: conda-linux-python3.11           , test-tox-env: py311           , build-tox-env: build-py311           , python-ver: "3.11", os: ubuntu-latest }
-          - { name: conda-linux-python3.12           , test-tox-env: py312           , build-tox-env: build-py312           , python-ver: "3.12", os: ubuntu-latest }
-          - { name: conda-linux-python3.12-upgraded  , test-tox-env: py312-upgraded  , build-tox-env: build-py312-upgraded  , python-ver: "3.12", os: ubuntu-latest }
-          - { name: conda-linux-python3.12-prerelease, test-tox-env: py312-prerelease, build-tox-env: build-py312-prerelease, python-ver: "3.12", os: ubuntu-latest }
+          - { name: conda-linux-python3.9-minimum    , test-tox-env: test-py39-minimum    , build-tox-env: build-py39-minimum    , python-ver: "3.9" , os: ubuntu-latest }
+          - { name: conda-linux-python3.10           , test-tox-env: test-py310           , build-tox-env: build-py310           , python-ver: "3.10", os: ubuntu-latest }
+          - { name: conda-linux-python3.11           , test-tox-env: test-py311           , build-tox-env: build-py311           , python-ver: "3.11", os: ubuntu-latest }
+          - { name: conda-linux-python3.12           , test-tox-env: test-py312           , build-tox-env: build-py312           , python-ver: "3.12", os: ubuntu-latest }
+          - { name: conda-linux-python3.13           , test-tox-env: test-py313           , build-tox-env: build-py313           , python-ver: "3.13", os: ubuntu-latest }
+          - { name: conda-linux-python3.13-upgraded  , test-tox-env: test-py313-upgraded  , build-tox-env: build-py313-upgraded  , python-ver: "3.13", os: ubuntu-latest }
+          - { name: conda-linux-python3.13-prerelease, test-tox-env: test-py313-prerelease, build-tox-env: build-py313-prerelease, python-ver: "3.13", os: ubuntu-latest }
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
@@ -201,9 +199,9 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - { name: conda-linux-python3.12-ros3  , python-ver: "3.12", os: ubuntu-latest }
-          - { name: conda-windows-python3.12-ros3, python-ver: "3.12", os: windows-latest }
-          - { name: conda-macos-python3.12-ros3  , python-ver: "3.12", os: macos-latest }
+          - { name: conda-linux-python3.13-ros3  , python-ver: "3.13", os: ubuntu-latest }
+          - { name: conda-windows-python3.13-ros3, python-ver: "3.13", os: windows-latest }
+          - { name: conda-macos-python3.13-ros3  , python-ver: "3.13", os: macos-latest }
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
@@ -248,9 +246,9 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - { name: conda-linux-gallery-python3.12-ros3  , python-ver: "3.12", os: ubuntu-latest }
-          - { name: conda-windows-gallery-python3.12-ros3, python-ver: "3.12", os: windows-latest }
-          - { name: conda-macos-gallery-python3.12-ros3  , python-ver: "3.12", os: macos-latest }
+          - { name: conda-linux-gallery-python3.13-ros3  , python-ver: "3.13", os: ubuntu-latest }
+          - { name: conda-windows-gallery-python3.13-ros3, python-ver: "3.13", os: windows-latest }
+          - { name: conda-macos-gallery-python3.13-ros3  , python-ver: "3.13", os: macos-latest }
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
diff --git a/.github/workflows/run_coverage.yml b/.github/workflows/run_coverage.yml
index ec42694d8..da74ef08c 100644
--- a/.github/workflows/run_coverage.yml
+++ b/.github/workflows/run_coverage.yml
@@ -28,7 +28,7 @@ jobs:
           - { os: macos-latest  , opt_req: false }
     env:
       OS: ${{ matrix.os }}
-      PYTHON: '3.12'
+      PYTHON: '3.13'
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
diff --git a/.github/workflows/run_dandi_read_tests.yml b/.github/workflows/run_dandi_read_tests.yml
index cdde371c6..f4b27cbd8 100644
--- a/.github/workflows/run_dandi_read_tests.yml
+++ b/.github/workflows/run_dandi_read_tests.yml
@@ -25,7 +25,7 @@ jobs:
       - name: Set up Python
         uses: actions/setup-python@v5
         with:
-          python-version: '3.12'
+          python-version: '3.13'
 
       - name: Install run dependencies
         run: |
diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml
index e365d78cf..3395bc07d 100644
--- a/.github/workflows/run_tests.yml
+++ b/.github/workflows/run_tests.yml
@@ -19,13 +19,13 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - { name: linux-python3.8-minimum      , test-tox-env: py38-minimum    , build-tox-env: build-py38-minimum   , python-ver: "3.8" , os: ubuntu-latest }
+          - { name: linux-python3.9-minimum      , test-tox-env: test-py39-minimum    , build-tox-env: build-py39-minimum   , python-ver: "3.9" , os: ubuntu-latest }
           # NOTE config below with "upload-wheels: true" specifies that wheels should be uploaded as an artifact
-          - { name: linux-python3.12-upgraded    , test-tox-env: py312-upgraded  , build-tox-env: build-py312-upgraded , python-ver: "3.12", os: ubuntu-latest , upload-wheels: true }
-          - { name: windows-python3.8-minimum    , test-tox-env: py38-minimum    , build-tox-env: build-py38-minimum   , python-ver: "3.8" , os: windows-latest }
-          - { name: windows-python3.12-upgraded  , test-tox-env: py312-upgraded  , build-tox-env: build-py312-upgraded , python-ver: "3.12", os: windows-latest }
-          # minimum versions of dependencies do not have wheels or cannot be built on macos-arm64
-          - { name: macos-python3.8-minimum      , test-tox-env: py38-minimum    , build-tox-env: build-py38-minimum   , python-ver: "3.8" , os: macos-13 }
+          - { name: linux-python3.13-upgraded    , test-tox-env: test-py313-upgraded  , build-tox-env: build-py313-upgraded , python-ver: "3.13", os: ubuntu-latest , upload-wheels: true }
+          - { name: windows-python3.9-minimum    , test-tox-env: test-py39-minimum    , build-tox-env: build-py39-minimum   , python-ver: "3.9" , os: windows-latest }
+          - { name: windows-python3.13-upgraded  , test-tox-env: test-py313-upgraded  , build-tox-env: build-py313-upgraded , python-ver: "3.13", os: windows-latest }
+          - { name: macos-python3.9-minimum      , test-tox-env: test-py39-minimum    , build-tox-env: build-py39-minimum   , python-ver: "3.9" , os: macos-13 }
+          - { name: macos-python3.13-upgraded    , test-tox-env: test-py313-upgraded  , build-tox-env: build-py313-upgraded , python-ver: "3.13" , os: macos-latest }
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
@@ -79,10 +79,10 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - { name: linux-gallery-python3.8-minimum    , test-tox-env: gallery-py38-minimum  , python-ver: "3.8" , os: ubuntu-latest }
-          - { name: linux-gallery-python3.12-upgraded  , test-tox-env: gallery-py312-upgraded, python-ver: "3.12", os: ubuntu-latest }
-          - { name: windows-gallery-python3.8-minimum  , test-tox-env: gallery-py38-minimum  , python-ver: "3.8" , os: windows-latest }
-          - { name: windows-gallery-python3.12-upgraded, test-tox-env: gallery-py312-upgraded, python-ver: "3.12", os: windows-latest }
+          - { name: linux-gallery-python3.9-minimum    , test-tox-env: gallery-py39-minimum  , python-ver: "3.9" , os: ubuntu-latest }
+          - { name: linux-gallery-python3.13-upgraded  , test-tox-env: gallery-py313-upgraded, python-ver: "3.13", os: ubuntu-latest }
+          - { name: windows-gallery-python3.9-minimum  , test-tox-env: gallery-py39-minimum  , python-ver: "3.9" , os: windows-latest }
+          - { name: windows-gallery-python3.13-upgraded, test-tox-env: gallery-py313-upgraded, python-ver: "3.13", os: windows-latest }
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
@@ -120,8 +120,8 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - { name: conda-linux-python3.8-minimum    , test-tox-env: py38-minimum    , build-tox-env: build-py38-minimum    , python-ver: "3.8" , os: ubuntu-latest }
-          - { name: conda-linux-python3.12-upgraded  , test-tox-env: py312-upgraded  , build-tox-env: build-py312-upgraded  , python-ver: "3.12", os: ubuntu-latest }
+          - { name: conda-linux-python3.9-minimum    , test-tox-env: test-py39-minimum    , build-tox-env: build-py39-minimum    , python-ver: "3.9" , os: ubuntu-latest }
+          - { name: conda-linux-python3.13-upgraded  , test-tox-env: test-py313-upgraded  , build-tox-env: build-py313-upgraded  , python-ver: "3.13", os: ubuntu-latest }
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
@@ -175,7 +175,7 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - { name: conda-linux-python3.12-ros3  , python-ver: "3.12", os: ubuntu-latest }
+          - { name: conda-linux-python3.13-ros3  , python-ver: "3.13", os: ubuntu-latest }
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
@@ -220,7 +220,7 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - { name: conda-linux-gallery-python3.12-ros3  , python-ver: "3.12", os: ubuntu-latest }
+          - { name: conda-linux-gallery-python3.13-ros3  , python-ver: "3.13", os: ubuntu-latest }
     steps:
       - name: Cancel non-latest runs
         uses: styfle/cancel-workflow-action@0.11.0
@@ -280,7 +280,7 @@ jobs:
       - name: Set up Python
         uses: actions/setup-python@v5
         with:
-          python-version: '3.12'
+          python-version: '3.13'
 
       - name: Download wheel and source distributions from artifact
         uses: actions/download-artifact@v4
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 773895dc5..fc360b840 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@
   - Added support for `model_number`, `model_name`, and `serial_number` fields to `Device`. @stephprince [#1997](https://github.com/NeurodataWithoutBorders/pynwb/pull/1997)
   - Deprecated `EventWaveform` neurodata type. @rly [#1940](https://github.com/NeurodataWithoutBorders/pynwb/pull/1940)
   - Deprecated `ImageMaskSeries` neurodata type. @rly [#1941](https://github.com/NeurodataWithoutBorders/pynwb/pull/1941)
+- Removed python 3.8 support, added python 3.13 support. @stephprince [#2007](https://github.com/NeurodataWithoutBorders/pynwb/pull/2007)
 
 ## PyNWB 2.8.3 (November 19, 2024)
 
diff --git a/docs/source/install_developers.rst b/docs/source/install_developers.rst
index 428a7e592..ba964ff26 100644
--- a/docs/source/install_developers.rst
+++ b/docs/source/install_developers.rst
@@ -6,7 +6,7 @@ Installing PyNWB for Developers
 
 PyNWB has the following minimum requirements, which must be installed before you can get started using PyNWB.
 
-#. Python 3.8, 3.9, 3.10, or 3.11
+#. Python 3.9, 3.10, 3.11, 3.12, or 3.13
 #. pip
 
 
@@ -54,11 +54,11 @@ Option 2: Using conda
 ^^^^^^^^^^^^^^^^^^^^^
 
 First, install Anaconda_ to install the ``conda`` tool. Then create and
-activate a new virtual environment called "venv" with Python 3.8 installed.
+activate a new virtual environment called "venv" with Python 3.9 installed.
 
 .. code:: bash
 
-    conda create --name venv python=3.8
+    conda create --name venv python=3.9
     conda activate venv
 
 Similar to a virtual environment created with ``virtualenv``, a conda environment
diff --git a/docs/source/install_users.rst b/docs/source/install_users.rst
index 368ab7bd0..1bae5c754 100644
--- a/docs/source/install_users.rst
+++ b/docs/source/install_users.rst
@@ -6,7 +6,7 @@ Installing PyNWB
 
 PyNWB has the following minimum requirements, which must be installed before you can get started using PyNWB.
 
-#. Python 3.8, 3.9, 3.10, or 3.11
+#. Python 3.9, 3.10, 3.11, 3.12, or 3.13
 #. pip
 
 .. note:: If you are a developer then please see the :ref:`install_developers` installation instructions instead.
diff --git a/environment-ros3.yml b/environment-ros3.yml
index 081408f19..bc7483f1e 100644
--- a/environment-ros3.yml
+++ b/environment-ros3.yml
@@ -4,20 +4,19 @@ channels:
   - conda-forge
   - defaults
 dependencies:
-  - python==3.12
-  - h5py==3.11.0
-  - hdmf==3.14.3
-  - matplotlib==3.8.4
-  - numpy==2.1.1
-  - pandas==2.2.2
+  - python==3.13
+  - h5py==3.12.1
+  - hdmf==3.14.5
+  - matplotlib==3.9.2
+  - numpy==2.1.3
+  - pandas==2.2.3
   - python-dateutil==2.9.0
   - setuptools
   - pytest==7.4.3  # pin to pytest < 8 because of incompatibilities to be addressed
   - fsspec==2024.6.0
   - requests==2.32.3
-  - aiohttp==3.9.5
+  - aiohttp==3.11.7
   - pip
   - pip:
     - remfile==0.1.13
     - dandi==0.62.1  # NOTE: dandi is not available on conda for osx-arm64
-
diff --git a/pyproject.toml b/pyproject.toml
index 14a11f5d5..122fbd05b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -14,15 +14,15 @@ authors = [
 ]
 description= "Package for working with Neurodata stored in the NWB format."
 readme = "README.rst"
-requires-python = ">=3.8"
+requires-python = ">=3.9"
 license = {text = "BSD-3-Clause"}
 classifiers = [
         "Programming Language :: Python",
-        "Programming Language :: Python :: 3.8",
         "Programming Language :: Python :: 3.9",
         "Programming Language :: Python :: 3.10",
         "Programming Language :: Python :: 3.11",
         "Programming Language :: Python :: 3.12",
+        "Programming Language :: Python :: 3.13",
         "License :: OSI Approved :: BSD License",
         "Development Status :: 5 - Production/Stable",
         "Intended Audience :: Developers",
@@ -33,11 +33,11 @@ classifiers = [
         "Topic :: Scientific/Engineering :: Medical Science Apps."
 ]
 dependencies = [
-    "h5py>=2.10",
+    "h5py>=3.2.0",
     "hdmf>=3.14.5",
-    "numpy>=1.18",
-    "pandas>=1.1.5",
-    "python-dateutil>=2.7.3",
+    "numpy>=1.23.0",
+    "pandas>=1.2.0",
+    "python-dateutil>=2.8.2",
 ]
 dynamic = ["version"] # the build backend will compute the version dynamically from git tag (or a __version__)
 
diff --git a/requirements-doc.txt b/requirements-doc.txt
index 30c41106d..8ff798ff2 100644
--- a/requirements-doc.txt
+++ b/requirements-doc.txt
@@ -12,8 +12,8 @@ dataframe_image   # used to render large dataframe as image in the sphinx galler
 lxml  # used by dataframe_image when using the matplotlib backend
 hdf5plugin
 dandi>=0.46.6
-hdmf-zarr
+hdmf-zarr>=0.3.0
 zarr<3  # limited to zarr<3 until hdmf-zarr resolves issues with zarr 3.0
-linkml-runtime==1.7.4; python_version >= "3.9"
-schemasheets==0.2.1; python_version >= "3.9"
-oaklib==0.5.32; python_version >= "3.9"
\ No newline at end of file
+linkml-runtime==1.7.4; python_version >= "3.10"
+schemasheets==0.2.1; python_version >= "3.10"
+oaklib==0.5.32; python_version >= "3.10"
\ No newline at end of file
diff --git a/requirements-min.txt b/requirements-min.txt
index feed604bc..c9dc53ee5 100644
--- a/requirements-min.txt
+++ b/requirements-min.txt
@@ -1,6 +1,6 @@
 # minimum versions of package dependencies for installing PyNWB
-h5py==2.10  # support for selection of datasets with list of indices added in 2.10
+h5py==3.2.0
 hdmf==3.14.5
-numpy==1.18
-pandas==1.1.5
-python-dateutil==2.7.3
+numpy==1.24.0
+pandas==1.2.0
+python-dateutil==2.8.2
diff --git a/requirements-opt.txt b/requirements-opt.txt
index a60e0c029..fa6a18806 100644
--- a/requirements-opt.txt
+++ b/requirements-opt.txt
@@ -1,6 +1,6 @@
-linkml-runtime==1.7.4; python_version >= "3.9"
-schemasheets==0.2.1; python_version >= "3.9"
-oaklib==0.5.32; python_version >= "3.9"
+linkml-runtime==1.7.4
+schemasheets==0.2.1
+oaklib==0.5.32
 
 # for streaming tests
 fsspec==2024.10.0
diff --git a/requirements.txt b/requirements.txt
index 1e7a5e18d..ad3152f3e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,7 @@
 # pinned dependencies to reproduce an entire development environment to use PyNWB
-h5py==3.11.0
+h5py==3.12.1
 hdmf==3.14.5
 numpy==2.1.1; python_version > "3.9"  # numpy 2.1+ is not compatible with py3.9
 numpy==2.0.2; python_version == "3.9"
-pandas==2.2.2
+pandas==2.2.3
 python-dateutil==2.9.0.post0
diff --git a/src/pynwb/__init__.py b/src/pynwb/__init__.py
index 3a4d95e98..32f9ed4d9 100644
--- a/src/pynwb/__init__.py
+++ b/src/pynwb/__init__.py
@@ -64,11 +64,7 @@ def unload_type_config(**kwargs):
     hdmf_unload_type_config(type_map=type_map)
 
 def __get_resources() -> dict:
-    try:
-        from importlib.resources import files
-    except ImportError:
-        # TODO: Remove when python 3.9 becomes the new minimum
-        from importlib_resources import files
+    from importlib.resources import files
 
     __location_of_this_file = files(__name__)
     __core_ns_file_name = 'nwb.namespace.yaml'
diff --git a/tests/integration/hdf5/test_ecephys.py b/tests/integration/hdf5/test_ecephys.py
index 754c2a8f4..a2c0db4b5 100644
--- a/tests/integration/hdf5/test_ecephys.py
+++ b/tests/integration/hdf5/test_ecephys.py
@@ -1,3 +1,5 @@
+import numpy as np
+
 from hdmf.common import DynamicTableRegion
 from pynwb import NWBFile
 
@@ -26,7 +28,8 @@ def setUpContainer(self):
                             description='a test ElectrodeGroup',
                             location='a nonexistent place',
                             device=self.dev1,
-                            position=(1., 2., 3.))
+                            position=np.array((1, 2, 3),
+                                              dtype=np.dtype([('x', float), ('y', float), ('z', float)])))
         return eg
 
     def addContainer(self, nwbfile):
diff --git a/tox.ini b/tox.ini
index 7920b6cd7..7deff7a70 100644
--- a/tox.ini
+++ b/tox.ini
@@ -4,174 +4,51 @@
 # and then run "tox" from this directory.
 
 [tox]
-envlist = py38, py39, py310, py311, py312
 requires = pip >= 22.0
 
 [testenv]
 download = True
 setenv =
-  PYTHONDONTWRITEBYTECODE = 1
-  VIRTUALENV_PIP = 23.3.1
+    PYTHONDONTWRITEBYTECODE = 1
+    VIRTUALENV_PIP = 23.3.1
 install_command =
-    python -m pip install -U {opts} {packages}
-
-deps =
-    -rrequirements-dev.txt
-    -rrequirements.txt
-commands =
-    python -m pip check  # Check for conflicting packages
-    python -m pip list
-    python test.py -v
-
-# Test with python 3.12; pinned dev reqs; upgraded run reqs
-[testenv:py312-upgraded]
-basepython = python3.12
-install_command =
-    python -m pip install -U {opts} {packages}
-deps =
-    -rrequirements-dev.txt
-commands = {[testenv]commands}
-
-# Test with python 3.11; optional and dev reqs (some features are not compatible with 3.12 yet)
-[testenv:py311-optional]
-basepython = python3.11
-deps =
-    -rrequirements-dev.txt
-    -rrequirements-opt.txt
-commands = {[testenv]commands}
-
-# Test with python 3.12; pinned dev reqs; upgraded, pre-release run reqs
-[testenv:py312-prerelease]
-basepython = python3.12
-install_command =
-    python -m pip install -U --pre {opts} {packages}
-deps =
-    -rrequirements-dev.txt
-commands = {[testenv]commands}
-
-# Test with python 3.8; pinned dev reqs; minimum run reqs
-[testenv:py38-minimum]
-basepython = python3.8
-deps =
-    -rrequirements-dev.txt
-    -rrequirements-min.txt
-commands = {[testenv]commands}
-
-# Envs that builds wheels and source distribution
-[testenv:build]
-commands =
-    python -m pip install --upgrade build
-    python -m build
-
-[testenv:build-py38]
-basepython = python3.8
-commands = {[testenv:build]commands}
-
-[testenv:build-py39]
-basepython = python3.9
-commands = {[testenv:build]commands}
-
-[testenv:build-py310]
-basepython = python3.10
-commands = {[testenv:build]commands}
-
-[testenv:build-py311]
-basepython = python3.11
-commands = {[testenv:build]commands}
-
-[testenv:build-py312]
-basepython = python3.12
-commands = {[testenv:build]commands}
-
-[testenv:build-py312-upgraded]
-basepython = python3.12
-install_command =
-    python -m pip install -U {opts} {packages}
-deps =
-    -rrequirements-dev.txt
-commands = {[testenv:build]commands}
-
-[testenv:build-py312-prerelease]
-basepython = python3.12
-install_command =
-    python -m pip install -U --pre {opts} {packages}
-deps =
-    -rrequirements-dev.txt
-commands = {[testenv:build]commands}
-
-[testenv:build-py38-minimum]
-basepython = python3.8
-deps =
-    -rrequirements-dev.txt
-    -rrequirements-min.txt
-commands = {[testenv:build]commands}
-
-# Envs that will test installation from a wheel
-[testenv:wheelinstall]
-deps = null
-commands = python -c "import pynwb"
-
-# Envs that will execute gallery tests that do not require ROS3
-# Test with pinned dev, doc, and run reqs
-[testenv:gallery]
-install_command =
-    python -m pip install -U {opts} {packages}
-deps =
-    -rrequirements.txt
-commands =
-    python -m pip install .
-    python -m pip install -r requirements-doc.txt  # NOTE: allensdk (requirements-doc.txt) requires pynwb
-    python -m pip check
-    python -m pip list
-    python test.py --example
-
-[testenv:gallery-py38]
-basepython = python3.8
-deps = {[testenv:gallery]deps}
-commands = {[testenv:gallery]commands}
-
-[testenv:gallery-py39]
-basepython = python3.9
-deps = {[testenv:gallery]deps}
-commands = {[testenv:gallery]commands}
-
-[testenv:gallery-py310]
-basepython = python3.10
-deps = {[testenv:gallery]deps}
-commands = {[testenv:gallery]commands}
-
-[testenv:gallery-py311]
-basepython = python3.11
-deps = {[testenv:gallery]deps}
-commands = {[testenv:gallery]commands}
-
-# Test with python 3.12; pinned dev, and doc reqs; upgraded run reqs
-[testenv:gallery-py312-upgraded]
-basepython = python3.12
-deps =
-    -rrequirements-dev.txt
+    pinned, minimum, wheelinstall: python -m pip install {opts} {packages}
+    upgraded:                      python -m pip install -U {opts} {packages}
+    prerelease:                    python -m pip install -U --pre {opts} {packages}
+deps =
+    # use pinned, minimum, or neither (use dependencies in pyproject.toml)
+    test, gallery, build:   -rrequirements-dev.txt
+    gallery:                -rrequirements-doc.txt
+    optional:               -rrequirements-opt.txt
+    pinned:                 -rrequirements.txt
+    minimum:                -rrequirements-min.txt
 commands =
-    python -m pip install -U .
-    python -m pip install -r requirements-doc.txt  # NOTE: allensdk (requirements-doc.txt) requires pynwb
-    python -m pip check
-    python -m pip list
-    python test.py --example
-
-# Test with python 3.12; pinned dev, doc, and optional reqs; pre-release run reqs
-[testenv:gallery-py312-prerelease]
-basepython = python3.12
-deps =
-    -rrequirements-dev.txt
-commands =
-    python -m pip install -U --pre .
-    python -m pip install -r requirements-doc.txt  # NOTE: allensdk (requirements-doc.txt) requires pynwb
-    python -m pip check
-    python -m pip list
-    python test.py --example
-
-# Test with python 3.8; pinned dev and doc reqs; minimum run reqs
-[testenv:gallery-py38-minimum]
-basepython = python3.8
-deps =
-    -rrequirements-min.txt
-commands = {[testenv:gallery]commands}
+    python --version     # print python version for debugging
+    python -m pip check  # check for conflicting packages
+    python -m pip list   # list installed packages for debugging
+    test:         python test.py -v
+    gallery:      python test.py --example
+    build:        python -m pip install -U build
+    build:        python -m build
+    wheelinstall: python -c "import pynwb"
+
+# list of pre-defined environments. (Technically environments not listed here
+# like build-py312 can also be used.)
+[testenv:test-py313-upgraded]
+[testenv:test-py313-prerelease]
+[testenv:test-py311-optional-pinned]  # some optional reqs not compatible with py312 yet
+[testenv:test-py{39,310,311,312,313}-pinned]
+[testenv:test-py39-minimum]
+
+[testenv:gallery-py313-upgraded]
+[testenv:gallery-py313-prerelease]
+[testenv:gallery-py311-optional-pinned]
+[testenv:gallery-py{39,310,311,312,313}-pinned]
+[testenv:gallery-py39-minimum]
+
+[testenv:build-py313-upgraded]
+[testenv:build-py313-prerelease]
+[testenv:build-py{39,310,311,312,313}-pinned]  # using tox for this so that we can have a clean build environment
+[testenv:build-py39-minimum]
+
+[testenv:wheelinstall]  # use with `--installpkg dist/*-none-any.whl`