diff --git a/nerval/evaluate.py b/nerval/evaluate.py
index 1c9472824800c76f51604818249c2c46645850f6..d741a83872873924f0adb74f1e37a56adb9199e6 100644
--- a/nerval/evaluate.py
+++ b/nerval/evaluate.py
@@ -1,7 +1,6 @@
 import csv
 import logging
 from pathlib import Path
-from typing import List
 
 import editdistance
 import edlib
@@ -322,7 +321,7 @@ def run(annotation: Path, prediction: Path, threshold: int, verbose: bool) -> di
     """
 
     # Get string and list of labels per character
-    def read_file(path: Path) -> List[str]:
+    def read_file(path: Path) -> list[str]:
         assert path.exists(), f"Error: Input file {path} does not exist"
         return path.read_text().strip().splitlines()
 
diff --git a/nerval/parse.py b/nerval/parse.py
index 31cc3c31c0f1428aba599d42fc86e1a34d35839a..abd41008b6a705d57ac7612db71ae48b995d2b86 100644
--- a/nerval/parse.py
+++ b/nerval/parse.py
@@ -1,5 +1,4 @@
 import re
-from typing import List
 
 from nerval import ALL_ENTITIES
 
@@ -51,7 +50,7 @@ def parse_line(index: int, line: str):
         raise Exception(f"The file is not in BIO format: check line {index} ({line})")
 
 
-def parse_bio(lines: List[str]) -> dict:
+def parse_bio(lines: list[str]) -> dict:
     """Parse a BIO file to get text content, character-level NE labels and entity types count.
 
     Input: lines of a valid BIO file
diff --git a/pyproject.toml b/pyproject.toml
index 551eac3c65519c73f9c91040dad7e5874e673e05..c875eb75d138bdd086806231c4393e1aef6649d3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -14,6 +14,7 @@ maintainers = [
     { name = "Teklia", email = "contact@teklia.com" },
 ]
 readme = { file = "README.md", content-type = "text/markdown" }
+requires-python = ">=3.10"
 
 [project.scripts]
 nerval = "nerval.cli:main"