diff --git a/README.md b/README.md
index 6594340..2e10cfe 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # Exclusive Boolean
 
-Adds an option to boolean fields on node content types to ensure that when a boolean field is checked on one node, it is automatically unchecked on all other nodes of the same type.
+Adds an option to boolean fields on node content types and taxonomy vocabularies to ensure that when a boolean field is checked on one node or term, it is automatically unchecked on all other nodes or terms of the same content type or vocabulary.
 
 ## Requirements
 
@@ -34,6 +34,8 @@ Adds an option to boolean fields on node content types to ensure that when a boo
 
 1. Navigate to a content type with a boolean field:
    - **Structure** → **Content types** → **[Your Content Type]** → **Manage fields**
+   - Or, for taxonomy terms: **Structure** → **Taxonomy** →
+     **[Your Vocabulary]** → **Manage fields**
 
 2. Click **Edit** on a boolean field
 
@@ -83,8 +85,9 @@ Once enabled for a boolean field:
    - The option only appears for boolean fields
    - Check the field type in the field list
 
-4. **Verify it's a node field**:
-   - The module only works with fields on node content types
+4. **Verify it's a node or taxonomy term field**:
+   - The module only works with fields on node content types and taxonomy
+     vocabularies
    - Fields on paragraphs, blocks, or other entity types are not supported
 
 ### The exclusive behavior doesn't work
diff --git a/exclusive_boolean.info.yml b/exclusive_boolean.info.yml
index fc582bd..7e9c209 100644
--- a/exclusive_boolean.info.yml
+++ b/exclusive_boolean.info.yml
@@ -1,6 +1,6 @@
 name: Exclusive Boolean
 type: module
-description: 'Adds an option to boolean fields to ensure only one node of the same type can have the field checked at a time.'
+description: 'Adds an option to boolean fields to ensure only one node or taxonomy term of the same bundle can have the field checked at a time.'
 package: Custom
 core_version_requirement: ^10.2 || ^11 || ^12
 dependencies:
diff --git a/exclusive_boolean.module b/exclusive_boolean.module
index 51ab80a..ec39dae 100644
--- a/exclusive_boolean.module
+++ b/exclusive_boolean.module
@@ -5,7 +5,7 @@
  * Exclusive Boolean module.
  *
  * Ensures that when a boolean field is checked on one node,
- * it is automatically unchecked on all other nodes of the same type.
+ * it is automatically unchecked on all other entities of the same bundle.
  */
 
 use Drupal\Core\Form\FormStateInterface;
diff --git a/src/Hook/ExclusiveBooleanHooks.php b/src/Hook/ExclusiveBooleanHooks.php
index 3b2e735..949fb42 100644
--- a/src/Hook/ExclusiveBooleanHooks.php
+++ b/src/Hook/ExclusiveBooleanHooks.php
@@ -2,13 +2,13 @@
 
 namespace Drupal\exclusive_boolean\Hook;
 
+use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Hook\Attribute\Hook;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\field\Entity\FieldConfig;
-use Drupal\node\NodeInterface;
 
 /**
  * Object-oriented hook implementations for the Exclusive Boolean module.
@@ -16,6 +16,10 @@ use Drupal\node\NodeInterface;
 final class ExclusiveBooleanHooks {
   use StringTranslationTrait;
 
+  /**
+   * Entity types supported by exclusive boolean fields.
+   */
+  const SUPPORTED_ENTITY_TYPES = ['node', 'taxonomy_term'];
 
   /**
    * The entity type manager service.
@@ -39,15 +43,14 @@ final class ExclusiveBooleanHooks {
  */
   #[Hook('entity_presave')]
   public function entityPresave(EntityInterface $entity): void {
-    // Only process node entities.
-    if (!$entity instanceof NodeInterface) {
+    if (!$entity instanceof ContentEntityInterface || !in_array($entity->getEntityTypeId(), self::SUPPORTED_ENTITY_TYPES, TRUE)) {
       return;
     }
 
-    // Get the node type.
-    $node_type = $entity->bundle();
+    $entity_type_id = $entity->getEntityTypeId();
+    $bundle = $entity->bundle();
 
-    // Get all fields on this node.
+    // Get all fields on this entity.
     $field_definitions = $entity->getFieldDefinitions();
 
     foreach ($field_definitions as $field_name => $field_definition) {
@@ -57,7 +60,7 @@ final class ExclusiveBooleanHooks {
       }
 
       // Check if this field has the exclusive option enabled.
-      $field_config = FieldConfig::loadByName('node', $node_type, $field_name);
+      $field_config = FieldConfig::loadByName($entity_type_id, $bundle, $field_name);
       if (!$field_config) {
         continue;
       }
@@ -74,28 +77,16 @@ final class ExclusiveBooleanHooks {
 
       $field_value = $entity->get($field_name)->value;
 
-      // If the field is being set to TRUE, uncheck it on all other nodes.
+      // If the field is being set to TRUE, uncheck it on all other entities.
       if ($field_value == TRUE) {
-        // Get all other nodes of the same type with this field set to TRUE.
-        $node_storage = $this->entityTypeManager->getStorage('node');
-        $query = $node_storage->getQuery()
-          ->condition('type', $node_type)
-          ->condition($field_name, TRUE)
-          ->accessCheck(FALSE);
-
-        // Exclude the current node if it's being updated.
-        if (!$entity->isNew()) {
-          $query->condition('nid', $entity->id(), '<>');
-        }
-
-        $nids = $query->execute();
-
-        if (!empty($nids)) {
-          // Load and update all other nodes.
-          $nodes = $node_storage->loadMultiple($nids);
-          foreach ($nodes as $node) {
-            $node->set($field_name, FALSE);
-            $node->save();
+        $ids = $this->getCheckedEntityIds($entity_type_id, $bundle, $field_name, $entity->isNew() ? NULL : $entity->id());
+
+        if (!empty($ids)) {
+          // Load and update all other entities.
+          $others = $this->entityTypeManager->getStorage($entity_type_id)->loadMultiple($ids);
+          foreach ($others as $other) {
+            $other->set($field_name, FALSE);
+            $other->save();
           }
         }
       }
@@ -128,31 +119,17 @@ final class ExclusiveBooleanHooks {
       $this->addExclusiveOption($form, $form_state);
     }
 
-    // Handle node forms - check multiple ways to identify node forms.
-    $is_node_form = FALSE;
-
-    // Check form ID pattern (node_* or node_form).
-    if (strpos($form_id, 'node_') === 0 || $form_id === 'node_form') {
-      $is_node_form = TRUE;
-    }
-
-    // Check form object.
-    if (!$is_node_form) {
-      $form_object = $form_state->getFormObject();
-      if ($form_object && method_exists($form_object, 'getEntity')) {
-        $entity = $form_object->getEntity();
-        if ($entity instanceof NodeInterface) {
-          $is_node_form = TRUE;
-        }
+    // Handle supported entity forms.
+    $is_entity_form = FALSE;
+    $form_object = $form_state->getFormObject();
+    if ($form_object && method_exists($form_object, 'getEntity')) {
+      $entity = $form_object->getEntity();
+      if ($entity instanceof ContentEntityInterface && in_array($entity->getEntityTypeId(), self::SUPPORTED_ENTITY_TYPES, TRUE)) {
+        $is_entity_form = TRUE;
       }
     }
 
-    // Check form entity.
-    if (!$is_node_form && isset($form['#entity']) && $form['#entity'] instanceof NodeInterface) {
-      $is_node_form = TRUE;
-    }
-
-    if ($is_node_form) {
+    if ($is_entity_form) {
       $this->addFieldDescriptions($form, $form_state);
     }
   }
@@ -179,8 +156,7 @@ final class ExclusiveBooleanHooks {
     $entity_type = $field_definition->getTargetEntityTypeId();
     $bundle = $field_definition->getTargetBundle();
 
-    // Only process node fields.
-    if ($entity_type !== 'node') {
+    if (!in_array($entity_type, self::SUPPORTED_ENTITY_TYPES, TRUE)) {
       return;
     }
 
@@ -200,15 +176,15 @@ final class ExclusiveBooleanHooks {
         return;
       }
 
-      // Get the current node being edited (if any).
-      $current_node = NULL;
-      $current_node_id = NULL;
+      // Get the current entity being edited (if any).
+      $current_entity = NULL;
+      $current_entity_id = NULL;
       $form_object = $form_state->getFormObject();
       if ($form_object && method_exists($form_object, 'getEntity')) {
         $entity = $form_object->getEntity();
-        if ($entity instanceof NodeInterface) {
-          $current_node = $entity;
-          $current_node_id = $entity->id();
+        if ($entity instanceof ContentEntityInterface && $entity->getEntityTypeId() === $entity_type) {
+          $current_entity = $entity;
+          $current_entity_id = $entity->id();
         }
       }
 
@@ -235,57 +211,49 @@ final class ExclusiveBooleanHooks {
         elseif (isset($element['value']['#default_value'])) {
           $is_currently_checked = (bool) $element['value']['#default_value'];
         }
-        elseif ($current_node && $current_node->hasField($field_name)) {
-          $is_currently_checked = (bool) $current_node->get($field_name)->value;
+        elseif ($current_entity && $current_entity->hasField($field_name)) {
+          $is_currently_checked = (bool) $current_entity->get($field_name)->value;
         }
       }
 
-      // Find which node currently has this field checked
-      // (excluding current node).
-      $checked_node = NULL;
-      $node_storage = $this->entityTypeManager->getStorage('node');
-      $query = $node_storage->getQuery()
-        ->condition('type', $bundle)
-        ->condition($field_name, TRUE)
-        ->accessCheck(FALSE)
-        ->range(0, 1);
-
-      // Exclude current node if editing existing node.
-      if ($current_node_id) {
-        $query->condition('nid', $current_node_id, '<>');
-      }
-
-      $nids = $query->execute();
-      if (!empty($nids)) {
-        $checked_node = $node_storage->load(reset($nids));
+      // Find which entity currently has this field checked
+      // (excluding current entity).
+      $checked_entity = NULL;
+      $ids = $this->getCheckedEntityIds($entity_type, $bundle, $field_name, $current_entity_id, 1);
+      if (!empty($ids)) {
+        $checked_entity = $this->entityTypeManager->getStorage($entity_type)->load(reset($ids));
       }
 
       // Get the bundle label (human-readable name) for better translatability.
+      $entity_type_definition = $this->entityTypeManager->getDefinition($entity_type);
+      $entity_type_label = $entity_type_definition->getPluralLabel();
       $bundle_label = $bundle;
-      $node_type_storage = $this->entityTypeManager->getStorage('node_type');
-      $node_type_entity = $node_type_storage->load($bundle);
-      if ($node_type_entity) {
-        $bundle_label = $node_type_entity->label();
+      $bundle_entity_type = $entity_type_definition->getBundleEntityType();
+      if ($bundle_entity_type && $bundle_entity = $this->entityTypeManager->getStorage($bundle_entity_type)->load($bundle)) {
+        $bundle_label = $bundle_entity->label();
       }
 
       // Build the description with current status
       // (only show status when unchecked).
       $status_text = '';
       if (!$is_currently_checked) {
-        // If this node is not checked, show which node has it checked (if any).
-        if ($checked_node) {
-          $node_title = $checked_node->getTitle();
-          $node_link = $checked_node->toLink($node_title)->toString();
-          $status_text = '<br />' . $this->t('Currently checked on: @link', ['@link' => $node_link]);
+        // If this entity is not checked, show which one has it checked.
+        if ($checked_entity) {
+          $entity_link = $checked_entity->toLink()->toString();
+          $status_text = '<br />' . $this->t('Currently checked on: @link', ['@link' => $entity_link]);
         }
         else {
-          $status_text = '<br />' . $this->t('No @type node currently has this field checked.', ['@type' => $bundle_label]);
+          $status_text = '<br />' . $this->t('No @type @entity_type currently has this field checked.', [
+            '@type' => $bundle_label,
+            '@entity_type' => $entity_type_definition->getSingularLabel(),
+          ]);
         }
       }
 
       $exclusive_description = $this->t('When checked, this field will be automatically unchecked on all
-    other @type nodes.', [
+    other @type @entity_type.', [
       '@type' => $bundle_label,
+      '@entity_type' => $entity_type_label,
     ]);
 
       // Determine which element to modify - prefer the actual checkbox element.
@@ -361,8 +329,8 @@ final class ExclusiveBooleanHooks {
       return;
     }
 
-    // Only process boolean fields on nodes.
-    if ($field_config->getType() !== 'boolean' || $field_config->getTargetEntityTypeId() !== 'node') {
+    // Only process boolean fields on supported entity types.
+    if ($field_config->getType() !== 'boolean' || !in_array($field_config->getTargetEntityTypeId(), self::SUPPORTED_ENTITY_TYPES, TRUE)) {
       return;
     }
 
@@ -394,9 +362,9 @@ final class ExclusiveBooleanHooks {
     $form['third_party_settings']['exclusive_boolean']['exclusive'] = [
       '#type' => 'checkbox',
       '#title' => $this->t('Make this field exclusive'),
-      '#description' => $this->t('When enabled, checking this field on one node will automatically uncheck it on 
-    all other nodes of the same type. A notice will be displayed under the field when editing nodes to inform users 
-    about this behavior.'),
+      '#description' => $this->t('When enabled, checking this field on one entity will automatically uncheck it on 
+    all other entities of the same bundle (content type or vocabulary). A notice will be displayed under the field 
+    when editing entities to inform users about this behavior.'),
       '#default_value' => $field_config->getThirdPartySetting('exclusive_boolean', 'exclusive', FALSE),
     ];
 
@@ -413,8 +381,8 @@ final class ExclusiveBooleanHooks {
    * Adds a description to the field widget.
    */
   public function fieldConfigEntityBuilder($entity_type, FieldConfig $field_config, array &$form, FormStateInterface $form_state): void {
-    // Only process boolean fields on nodes.
-    if ($field_config->getType() !== 'boolean' || $field_config->getTargetEntityTypeId() !== 'node') {
+    // Only process boolean fields on supported entity types.
+    if ($field_config->getType() !== 'boolean' || !in_array($field_config->getTargetEntityTypeId(), self::SUPPORTED_ENTITY_TYPES, TRUE)) {
       return;
     }
 
@@ -430,4 +398,25 @@ final class ExclusiveBooleanHooks {
     $field_config->setThirdPartySetting('exclusive_boolean', 'exclusive', $exclusive);
   }
 
+  /**
+   * Gets IDs of entities of a bundle that have the given field checked.
+   */
+  private function getCheckedEntityIds(string $entity_type_id, string $bundle, string $field_name, $exclude_id = NULL, ?int $limit = NULL): array {
+    $entity_type = $this->entityTypeManager->getDefinition($entity_type_id);
+    $query = $this->entityTypeManager->getStorage($entity_type_id)->getQuery()
+      ->condition($entity_type->getKey('bundle'), $bundle)
+      ->condition($field_name, TRUE)
+      ->accessCheck(FALSE);
+
+    // Exclude the current entity if it's being updated.
+    if ($exclude_id !== NULL) {
+      $query->condition($entity_type->getKey('id'), $exclude_id, '<>');
+    }
+    if ($limit) {
+      $query->range(0, $limit);
+    }
+
+    return $query->execute();
+  }
+
 }
