diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8bad983..c51cdf6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,7 +13,8 @@
   dot shorthand.
 
 * Require `analyzer: '>=8.2.0 <10.0.0'`.
-* Require `sdk: ^3.9.0`
+* Require `args: ^2.5.0`.
+* Require `sdk: ^3.9.0`.
 
 ### Bug fixes
 
diff --git a/lib/src/cli/format_command.dart b/lib/src/cli/format_command.dart
index 9e92629..5d51151 100644
--- a/lib/src/cli/format_command.dart
+++ b/lib/src/cli/format_command.dart
@@ -178,33 +178,20 @@
   Future<int> run() async {
     var argResults = this.argResults!;
 
-    if (argResults['version'] as bool) {
+    if (argResults.flag('version')) {
       print(dartStyleVersion);
       return 0;
     }
 
-    var show = const {
-      'all': Show.all,
-      'changed': Show.changed,
-      'none': Show.none,
-    }[argResults['show']]!;
+    var show = Show.values.byName(argResults.option('show')!);
 
-    var output = const {
-      'write': Output.write,
-      'show': Output.show,
-      'none': Output.none,
-      'json': Output.json,
-    }[argResults['output']]!;
+    var output = Output.values.byName(argResults.option('output')!);
 
-    var summary = Summary.none;
-    switch (argResults['summary'] as String) {
-      case 'line':
-        summary = Summary.line();
-        break;
-      case 'profile':
-        summary = Summary.profile();
-        break;
-    }
+    var summary = switch (argResults.option('summary')) {
+      'line' => Summary.line(),
+      'profile' => Summary.profile(),
+      _ => Summary.none,
+    };
 
     // If the user is sending code through stdin, default the output to stdout.
     if (!argResults.wasParsed('output') && argResults.rest.isEmpty) {
@@ -224,7 +211,7 @@
     }
 
     // Can't use --verbose with anything but --help.
-    if (argResults['verbose'] as bool && !(argResults['help'] as bool)) {
+    if (argResults.flag('verbose') && !argResults.flag('help')) {
       usageException('Can only use --verbose with --help.');
     }
 
@@ -234,7 +221,7 @@
     }
 
     Version? languageVersion;
-    if (argResults['language-version'] case String version) {
+    if (argResults.option('language-version') case String version) {
       var versionPattern = RegExp(r'^([0-9]+)\.([0-9]+)$');
       if (version == 'latest') {
         languageVersion = DartFormatter.latestLanguageVersion;
@@ -255,9 +242,9 @@
     // Allow the old option name if the new one wasn't passed.
     String? pageWidthString;
     if (argResults.wasParsed('page-width')) {
-      pageWidthString = argResults['page-width'] as String;
+      pageWidthString = argResults.option('page-width')!;
     } else if (argResults.wasParsed('line-length')) {
-      pageWidthString = argResults['line-length'] as String;
+      pageWidthString = argResults.option('line-length')!;
     }
 
     int? pageWidth;
@@ -276,7 +263,7 @@
     if (argResults.wasParsed('trailing-commas')) {
       // We check the values explicitly here instead of using `allowedValues`
       // from [ArgParser] because this provides a better error message.
-      trailingCommas = switch (argResults['trailing-commas']) {
+      trailingCommas = switch (argResults.option('trailing-commas')) {
         'automate' => TrailingCommas.automate,
         'preserve' => TrailingCommas.preserve,
         var mode => usageException(
@@ -286,10 +273,10 @@
     }
 
     var indent =
-        int.tryParse(argResults['indent'] as String) ??
+        int.tryParse(argResults.option('indent')!) ??
         usageException(
           '--indent must be an integer, was '
-          '"${argResults['indent']}".',
+          '"${argResults.option('indent')}".',
         );
 
     if (indent < 0) {
@@ -306,10 +293,10 @@
       usageException(exception.message);
     }
 
-    var followLinks = argResults['follow-links'] as bool;
-    var setExitIfChanged = argResults['set-exit-if-changed'] as bool;
+    var followLinks = argResults.flag('follow-links');
+    var setExitIfChanged = argResults.flag('set-exit-if-changed');
 
-    var experimentFlags = argResults['enable-experiment'] as List<String>;
+    var experimentFlags = argResults.multiOption('enable-experiment');
 
     // If stdin isn't connected to a pipe, then the user is not passing
     // anything to stdin, so let them know they made a mistake.
@@ -324,7 +311,7 @@
     if (argResults.wasParsed('stdin-name') && argResults.rest.isNotEmpty) {
       usageException('Cannot pass --stdin-name when not reading from stdin.');
     }
-    var stdinName = argResults['stdin-name'] as String?;
+    var stdinName = argResults.option('stdin-name');
 
     var options = FormatterOptions(
       languageVersion: languageVersion,
@@ -352,7 +339,7 @@
   }
 
   List<int>? _parseSelection(ArgResults argResults, String optionName) {
-    var option = argResults[optionName] as String?;
+    var option = argResults.option(optionName);
     if (option == null) return null;
 
     // Can only preserve a selection when parsing from stdin.
@@ -375,7 +362,7 @@
     } on FormatException catch (_) {
       throw FormatException(
         '--$optionName must be a colon-separated pair of integers, was '
-        '"${argResults[optionName]}".',
+        '"$option".',
       );
     }
   }
diff --git a/pubspec.yaml b/pubspec.yaml
index 180c73d..1180ab6 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -10,7 +10,7 @@
 
 dependencies:
   analyzer: '>=8.2.0 <10.0.0'
-  args: ^2.0.0
+  args: ^2.5.0
   collection: ^1.19.0
   package_config: ^2.1.0
   path: ^1.9.0
