diff --git a/core/lib/Drupal/Core/Hook/Attribute/FormAlter.php b/core/lib/Drupal/Core/Hook/Attribute/FormAlter.php
deleted file mode 100644
index 158010463d2aba6ec1e6452f6628c258b74c2f0d..0000000000000000000000000000000000000000
--- a/core/lib/Drupal/Core/Hook/Attribute/FormAlter.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\Core\Hook\Attribute;
-
-use Drupal\Core\Hook\Order\OrderInterface;
-
-/**
- * Hook attribute for FormAlter.
- *
- * @see hook_form_alter().
- */
-#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
-class FormAlter extends Hook {
-
-  /**
-   * {@inheritdoc}
-   */
-  public const string PREFIX = 'form';
-
-  /**
-   * {@inheritdoc}
-   */
-  public const string SUFFIX = 'alter';
-
-  /**
-   * Constructs a FormAlter attribute object.
-   *
-   * @param string $form_id
-   *   (optional) The ID of the form that this implementation alters.
-   *   If this is left blank then `form_alter` is the hook that is registered.
-   * @param string $method
-   *   (optional) The method name. If this attribute is on a method, this
-   *   parameter is not required. If this attribute is on a class and this
-   *   parameter is omitted, the class must have an __invoke() method, which is
-   *   taken as the hook implementation.
-   * @param string|null $module
-   *   (optional) The module this implementation is for. This allows one module
-   *   to implement a hook on behalf of another module. Defaults to the module
-   *   the implementation is in.
-   * @param \Drupal\Core\Hook\Order\OrderInterface|null $order
-   *   (optional) Set the order of the implementation.
-   */
-  public function __construct(
-    string $form_id = '',
-    public string $method = '',
-    public ?string $module = NULL,
-    public ?OrderInterface $order = NULL,
-  ) {
-    parent::__construct($form_id, $method, $module, $order);
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Hook/Attribute/Hook.php b/core/lib/Drupal/Core/Hook/Attribute/Hook.php
index 34dbc8ebf916693239a23c2640d3a60d21eef6db..0084e651180dd720c9681e5788f5a87d181dc94d 100644
--- a/core/lib/Drupal/Core/Hook/Attribute/Hook.php
+++ b/core/lib/Drupal/Core/Hook/Attribute/Hook.php
@@ -97,28 +97,11 @@
 #[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
 class Hook implements HookAttributeInterface {
 
-  /**
-   * The hook prefix such as `form`.
-   *
-   * @var string
-   */
-  public const string PREFIX = '';
-
-  /**
-   * The hook suffix such as `alter`.
-   *
-   * @var string
-   */
-  public const string SUFFIX = '';
-
   /**
    * Constructs a Hook attribute object.
    *
    * @param string $hook
    *   The short hook name, without the 'hook_' prefix.
-   *   $hook is only optional when Hook is extended and a PREFIX or SUFFIX is
-   *   defined. When using the [#Hook] attribute directly $hook is required.
-   *   See Drupal\Core\Hook\Attribute\Preprocess.
    * @param string $method
    *   (optional) The method name. If this attribute is on a method, this
    *   parameter is not required. If this attribute is on a class and this
@@ -132,15 +115,10 @@ class Hook implements HookAttributeInterface {
    *   (optional) Set the order of the implementation.
    */
   public function __construct(
-    public string $hook = '',
+    public string $hook,
     public string $method = '',
     public ?string $module = NULL,
     public ?OrderInterface $order = NULL,
-  ) {
-    $this->hook = implode('_', array_filter([static::PREFIX, $hook, static::SUFFIX]));
-    if ($this->hook === '') {
-      throw new \LogicException('The Hook attribute or an attribute extending the Hook attribute must provide the $hook parameter, a PREFIX or a SUFFIX.');
-    }
-  }
+  ) {}
 
 }
diff --git a/core/lib/Drupal/Core/Hook/Attribute/Preprocess.php b/core/lib/Drupal/Core/Hook/Attribute/Preprocess.php
deleted file mode 100644
index 47642859a20bfabee89f1e38dcf5f43e0cbe4437..0000000000000000000000000000000000000000
--- a/core/lib/Drupal/Core/Hook/Attribute/Preprocess.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace Drupal\Core\Hook\Attribute;
-
-/**
- * Attribute for defining a class method as a preprocess function.
- *
- * Pass no arguments for hook_preprocess `#[Preprocess]`.
- * For `hook_preprocess_HOOK` pass the `HOOK` without the `hook_preprocess`
- * portion `#[Preprocess('HOOK')]`.
- *
- * See \Drupal\Core\Hook\Attribute\Hook for additional information.
- */
-#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
-class Preprocess extends Hook {
-  /**
-   * {@inheritdoc}
-   */
-  public const string PREFIX = 'preprocess';
-
-}
diff --git a/core/modules/comment/src/Hook/CommentThemeHooks.php b/core/modules/comment/src/Hook/CommentThemeHooks.php
index e789af6dab1078c5150ba000d962dad7003523d0..c137d586d416e9a77f8b485c6d2ef9d14805045e 100644
--- a/core/modules/comment/src/Hook/CommentThemeHooks.php
+++ b/core/modules/comment/src/Hook/CommentThemeHooks.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\comment\Hook;
 
-use Drupal\Core\Hook\Attribute\Preprocess;
+use Drupal\Core\Hook\Attribute\Hook;
 
 /**
  * Hook implementations for comment.
@@ -12,7 +12,7 @@ class CommentThemeHooks {
   /**
    * Implements hook_preprocess_HOOK() for block templates.
    */
-  #[Preprocess('block')]
+  #[Hook('preprocess_block')]
   public function preprocessBlock(&$variables): void {
     if ($variables['configuration']['provider'] == 'comment') {
       $variables['attributes']['role'] = 'navigation';
diff --git a/core/modules/comment/tests/modules/comment_empty_title_test/src/Hook/CommentEmptyTitleTestThemeHooks.php b/core/modules/comment/tests/modules/comment_empty_title_test/src/Hook/CommentEmptyTitleTestThemeHooks.php
index db1ffae5a6d0e89d442da380a21b2c9474d21c76..01a40394b4093d513a785c012fba93b083fa7473 100644
--- a/core/modules/comment/tests/modules/comment_empty_title_test/src/Hook/CommentEmptyTitleTestThemeHooks.php
+++ b/core/modules/comment/tests/modules/comment_empty_title_test/src/Hook/CommentEmptyTitleTestThemeHooks.php
@@ -4,7 +4,7 @@
 
 namespace Drupal\comment_empty_title_test\Hook;
 
-use Drupal\Core\Hook\Attribute\Preprocess;
+use Drupal\Core\Hook\Attribute\Hook;
 
 /**
  * Hook implementations for comment_empty_title_test.
@@ -14,7 +14,7 @@ class CommentEmptyTitleTestThemeHooks {
   /**
    * Implements hook_preprocess_comment().
    */
-  #[Preprocess('comment')]
+  #[Hook('preprocess_comment')]
   public function preprocessComment(&$variables): void {
     $variables['title'] = '';
   }
diff --git a/core/modules/contact/src/Hook/ContactFormHooks.php b/core/modules/contact/src/Hook/ContactFormHooks.php
index ad8223c3ec62f42dbfe748eeb8f05cc4b49f18a1..b31b929bddf249c10d39e16dd00442d532004134 100644
--- a/core/modules/contact/src/Hook/ContactFormHooks.php
+++ b/core/modules/contact/src/Hook/ContactFormHooks.php
@@ -4,7 +4,7 @@
 
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Hook\Attribute\FormAlter;
+use Drupal\Core\Hook\Attribute\Hook;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\user\UserDataInterface;
@@ -29,7 +29,7 @@ public function __construct(
    *
    * @see \Drupal\user\ProfileForm::form()
    */
-  #[FormAlter('user_form')]
+  #[Hook('form_user_form_alter')]
   public function formUserFormAlter(&$form, FormStateInterface $form_state) : void {
     $form['contact'] = [
       '#type' => 'details',
@@ -55,7 +55,7 @@ public function formUserFormAlter(&$form, FormStateInterface $form_state) : void
    *
    * Adds the default personal contact setting on the user settings page.
    */
-  #[FormAlter('user_admin_settings')]
+  #[Hook('form_user_admin_settings_alter')]
   public function formUserAdminSettingsAlter(&$form, FormStateInterface $form_state) : void {
     $form['contact'] = [
       '#type' => 'details',
diff --git a/core/modules/contextual/src/Hook/ContextualThemeHooks.php b/core/modules/contextual/src/Hook/ContextualThemeHooks.php
index 760a42c978546b7ea757d7c93775be2603bae4e6..7d873196b431f3db8e89bd973b38f5f13ea4da8c 100644
--- a/core/modules/contextual/src/Hook/ContextualThemeHooks.php
+++ b/core/modules/contextual/src/Hook/ContextualThemeHooks.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\contextual\Hook;
 
-use Drupal\Core\Hook\Attribute\Preprocess;
+use Drupal\Core\Hook\Attribute\Hook;
 use Drupal\Core\Session\AccountInterface;
 
 /**
@@ -21,7 +21,7 @@ public function __construct(
    * @see contextual_page_attachments()
    * @see \Drupal\contextual\ContextualController::render()
    */
-  #[Preprocess]
+  #[Hook('preprocess')]
   public function preprocess(&$variables, $hook, $info): void {
     // Determine the primary theme function argument.
     if (!empty($info['variables'])) {
diff --git a/core/modules/locale/src/Hook/LocaleThemeHooks.php b/core/modules/locale/src/Hook/LocaleThemeHooks.php
index d1e438f50acef5368d96f9184388cf4bf2cedc0c..4ef5ca0b498944df50f5fcba78e95db565447233 100644
--- a/core/modules/locale/src/Hook/LocaleThemeHooks.php
+++ b/core/modules/locale/src/Hook/LocaleThemeHooks.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\locale\Hook;
 
-use Drupal\Core\Hook\Attribute\Preprocess;
+use Drupal\Core\Hook\Attribute\Hook;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
 
@@ -18,7 +18,7 @@ public function __construct(
   /**
    * Implements hook_preprocess_HOOK() for node templates.
    */
-  #[Preprocess('node')]
+  #[Hook('preprocess_node')]
   public function preprocessNode(&$variables): void {
     /** @var \Drupal\node\NodeInterface $node */
     $node = $variables['node'];
diff --git a/core/modules/node/src/Hook/NodeThemeHooks.php b/core/modules/node/src/Hook/NodeThemeHooks.php
index 7ee443c458f86b2445283a2dfaec1505f16bea29..7ed0ef91f5fda3f1cfe0368885a7ee50e53126a8 100644
--- a/core/modules/node/src/Hook/NodeThemeHooks.php
+++ b/core/modules/node/src/Hook/NodeThemeHooks.php
@@ -4,7 +4,7 @@
 
 namespace Drupal\node\Hook;
 
-use Drupal\Core\Hook\Attribute\Preprocess;
+use Drupal\Core\Hook\Attribute\Hook;
 
 /**
  * Hook implementations for the node module.
@@ -14,7 +14,7 @@ class NodeThemeHooks {
   /**
    * Implements hook_preprocess_HOOK() for node field templates.
    */
-  #[Preprocess('field__node')]
+  #[Hook('preprocess_field__node')]
   public function preprocessFieldNode(&$variables): void {
     // Set a variable 'is_inline' in cases where inline markup is required,
     // without any block elements such as <div>.
diff --git a/core/modules/system/tests/modules/module_test_oop_preprocess/src/Hook/ModuleTestOopPreprocessThemeHooks.php b/core/modules/system/tests/modules/module_test_oop_preprocess/src/Hook/ModuleTestOopPreprocessThemeHooks.php
index 1cbb9e6b422b354e2ec9bdc00d854db6f7b80f6b..db923382a21b5eefcd2c5a2db6569fc0977b2fde 100644
--- a/core/modules/system/tests/modules/module_test_oop_preprocess/src/Hook/ModuleTestOopPreprocessThemeHooks.php
+++ b/core/modules/system/tests/modules/module_test_oop_preprocess/src/Hook/ModuleTestOopPreprocessThemeHooks.php
@@ -4,19 +4,19 @@
 
 namespace Drupal\module_test_oop_preprocess\Hook;
 
-use Drupal\Core\Hook\Attribute\Preprocess;
+use Drupal\Core\Hook\Attribute\Hook;
 
 /**
  * Hook implementations for module_test_oop_preprocess.
  */
 class ModuleTestOopPreprocessThemeHooks {
 
-  #[Preprocess]
+  #[Hook('preprocess')]
   public function rootPreprocess($arg): mixed {
     return $arg;
   }
 
-  #[Preprocess('test')]
+  #[Hook('preprocess_test')]
   public function preprocessTest($arg): mixed {
     return $arg;
   }
diff --git a/core/modules/system/tests/modules/theme_test/src/Hook/ThemeTestThemeHooks.php b/core/modules/system/tests/modules/theme_test/src/Hook/ThemeTestThemeHooks.php
index fc48756de51a0836fe14f08d85c3cf96c763807c..7bfc10ef0ef9473e4b4c0af9442ee2659405b5f2 100644
--- a/core/modules/system/tests/modules/theme_test/src/Hook/ThemeTestThemeHooks.php
+++ b/core/modules/system/tests/modules/theme_test/src/Hook/ThemeTestThemeHooks.php
@@ -4,7 +4,7 @@
 
 namespace Drupal\theme_test\Hook;
 
-use Drupal\Core\Hook\Attribute\Preprocess;
+use Drupal\Core\Hook\Attribute\Hook;
 
 /**
  * Hook implementations for theme_test.
@@ -14,7 +14,7 @@ class ThemeTestThemeHooks {
   /**
    * Implements hook_preprocess_HOOK().
    */
-  #[Preprocess('theme_test_preprocess_suggestions__monkey')]
+  #[Hook('preprocess_theme_test_preprocess_suggestions__monkey')]
   public function preprocessTestSuggestions(&$variables): void {
     $variables['foo'] = 'Monkey';
   }