diff --git a/printing/print_settings_conversion.cc b/printing/print_settings_conversion.cc
index ed18b7a..9e381216 100644
--- a/printing/print_settings_conversion.cc
+++ b/printing/print_settings_conversion.cc
@@ -31,16 +31,16 @@
 
 // Note: If this code crashes, then the caller has passed in invalid `settings`.
 // Fix the caller, instead of trying to avoid the crash here.
-PageMargins GetCustomMarginsFromJobSettings(const base::Value& settings) {
+PageMargins GetCustomMarginsFromJobSettings(const base::Value::Dict& settings) {
   PageMargins margins_in_points;
-  const base::Value* custom_margins = settings.FindKey(kSettingMarginsCustom);
-  margins_in_points.top = custom_margins->FindIntKey(kSettingMarginTop).value();
+  const base::Value::Dict* custom_margins =
+      settings.FindDict(kSettingMarginsCustom);
+  margins_in_points.top = custom_margins->FindInt(kSettingMarginTop).value();
   margins_in_points.bottom =
-      custom_margins->FindIntKey(kSettingMarginBottom).value();
-  margins_in_points.left =
-      custom_margins->FindIntKey(kSettingMarginLeft).value();
+      custom_margins->FindInt(kSettingMarginBottom).value();
+  margins_in_points.left = custom_margins->FindInt(kSettingMarginLeft).value();
   margins_in_points.right =
-      custom_margins->FindIntKey(kSettingMarginRight).value();
+      custom_margins->FindInt(kSettingMarginRight).value();
   return margins_in_points;
 }
 
@@ -77,44 +77,44 @@
 
 }  // namespace
 
-PageRanges GetPageRangesFromJobSettings(const base::Value& job_settings) {
+PageRanges GetPageRangesFromJobSettings(const base::Value::Dict& job_settings) {
   PageRanges page_ranges;
-  const base::Value* page_range_array =
-      job_settings.FindListKey(kSettingPageRange);
-  if (page_range_array) {
-    for (const base::Value& page_range :
-         page_range_array->GetListDeprecated()) {
-      if (!page_range.is_dict())
-        continue;
+  const base::Value::List* page_range_array =
+      job_settings.FindList(kSettingPageRange);
+  if (!page_range_array)
+    return page_ranges;
 
-      absl::optional<int> from = page_range.FindIntKey(kSettingPageRangeFrom);
-      absl::optional<int> to = page_range.FindIntKey(kSettingPageRangeTo);
-      if (!from.has_value() || !to.has_value())
-        continue;
+  for (const base::Value& page_range : *page_range_array) {
+    if (!page_range.is_dict())
+      continue;
 
-      // Page numbers are 1-based in the dictionary.
-      // Page numbers are 0-based for the printing context.
-      page_ranges.push_back(PageRange{static_cast<uint32_t>(from.value() - 1),
-                                      static_cast<uint32_t>(to.value() - 1)});
-    }
+    const auto& dict = page_range.GetDict();
+    absl::optional<int> from = dict.FindInt(kSettingPageRangeFrom);
+    absl::optional<int> to = dict.FindInt(kSettingPageRangeTo);
+    if (!from.has_value() || !to.has_value())
+      continue;
+
+    // Page numbers are 1-based in the dictionary.
+    // Page numbers are 0-based for the printing context.
+    page_ranges.push_back(PageRange{static_cast<uint32_t>(from.value() - 1),
+                                    static_cast<uint32_t>(to.value() - 1)});
   }
   return page_ranges;
 }
 
 std::unique_ptr<PrintSettings> PrintSettingsFromJobSettings(
-    const base::Value& job_settings) {
+    const base::Value::Dict& job_settings) {
   auto settings = std::make_unique<PrintSettings>();
   absl::optional<bool> display_header_footer =
-      job_settings.FindBoolKey(kSettingHeaderFooterEnabled);
+      job_settings.FindBool(kSettingHeaderFooterEnabled);
   if (!display_header_footer.has_value())
     return nullptr;
 
   settings->set_display_header_footer(display_header_footer.value());
   if (settings->display_header_footer()) {
     const std::string* title =
-        job_settings.FindStringKey(kSettingHeaderFooterTitle);
-    const std::string* url =
-        job_settings.FindStringKey(kSettingHeaderFooterURL);
+        job_settings.FindString(kSettingHeaderFooterTitle);
+    const std::string* url = job_settings.FindString(kSettingHeaderFooterURL);
     if (!title || !url)
       return nullptr;
 
@@ -123,9 +123,9 @@
   }
 
   absl::optional<bool> backgrounds =
-      job_settings.FindBoolKey(kSettingShouldPrintBackgrounds);
+      job_settings.FindBool(kSettingShouldPrintBackgrounds);
   absl::optional<bool> selection_only =
-      job_settings.FindBoolKey(kSettingShouldPrintSelectionOnly);
+      job_settings.FindBool(kSettingShouldPrintSelectionOnly);
   if (!backgrounds.has_value() || !selection_only.has_value())
     return nullptr;
 
@@ -133,27 +133,27 @@
   settings->set_selection_only(selection_only.value());
 
   PrintSettings::RequestedMedia requested_media;
-  const base::Value* media_size_value = job_settings.FindKeyOfType(
-      kSettingMediaSize, base::Value::Type::DICTIONARY);
+  const base::Value::Dict* media_size_value =
+      job_settings.FindDict(kSettingMediaSize);
   if (media_size_value) {
     absl::optional<int> width_microns =
-        media_size_value->FindIntKey(kSettingMediaSizeWidthMicrons);
+        media_size_value->FindInt(kSettingMediaSizeWidthMicrons);
     absl::optional<int> height_microns =
-        media_size_value->FindIntKey(kSettingMediaSizeHeightMicrons);
+        media_size_value->FindInt(kSettingMediaSizeHeightMicrons);
     if (width_microns.has_value() && height_microns.has_value()) {
       requested_media.size_microns =
           gfx::Size(width_microns.value(), height_microns.value());
     }
 
     const std::string* vendor_id =
-        media_size_value->FindStringKey(kSettingMediaSizeVendorId);
+        media_size_value->FindString(kSettingMediaSizeVendorId);
     if (vendor_id && !vendor_id->empty())
       requested_media.vendor_id = *vendor_id;
   }
   settings->set_requested_media(requested_media);
 
   mojom::MarginType margin_type = static_cast<mojom::MarginType>(
-      job_settings.FindIntKey(kSettingMarginsType)
+      job_settings.FindInt(kSettingMarginsType)
           .value_or(static_cast<int>(mojom::MarginType::kDefaultMargins)));
   if (margin_type != mojom::MarginType::kDefaultMargins &&
       margin_type != mojom::MarginType::kNoMargins &&
@@ -168,17 +168,16 @@
 
   settings->set_ranges(GetPageRangesFromJobSettings(job_settings));
 
-  absl::optional<bool> collate = job_settings.FindBoolKey(kSettingCollate);
-  absl::optional<int> copies = job_settings.FindIntKey(kSettingCopies);
-  absl::optional<int> color = job_settings.FindIntKey(kSettingColor);
-  absl::optional<int> duplex_mode = job_settings.FindIntKey(kSettingDuplexMode);
-  absl::optional<bool> landscape = job_settings.FindBoolKey(kSettingLandscape);
-  absl::optional<int> scale_factor =
-      job_settings.FindIntKey(kSettingScaleFactor);
+  absl::optional<bool> collate = job_settings.FindBool(kSettingCollate);
+  absl::optional<int> copies = job_settings.FindInt(kSettingCopies);
+  absl::optional<int> color = job_settings.FindInt(kSettingColor);
+  absl::optional<int> duplex_mode = job_settings.FindInt(kSettingDuplexMode);
+  absl::optional<bool> landscape = job_settings.FindBool(kSettingLandscape);
+  absl::optional<int> scale_factor = job_settings.FindInt(kSettingScaleFactor);
   absl::optional<bool> rasterize_pdf =
-      job_settings.FindBoolKey(kSettingRasterizePdf);
+      job_settings.FindBool(kSettingRasterizePdf);
   absl::optional<int> pages_per_sheet =
-      job_settings.FindIntKey(kSettingPagesPerSheet);
+      job_settings.FindInt(kSettingPagesPerSheet);
 
   if (!collate.has_value() || !copies.has_value() || !color.has_value() ||
       !duplex_mode.has_value() || !landscape.has_value() ||
@@ -188,15 +187,14 @@
   }
 
   absl::optional<int> dpi_horizontal =
-      job_settings.FindIntKey(kSettingDpiHorizontal);
-  absl::optional<int> dpi_vertical =
-      job_settings.FindIntKey(kSettingDpiVertical);
+      job_settings.FindInt(kSettingDpiHorizontal);
+  absl::optional<int> dpi_vertical = job_settings.FindInt(kSettingDpiVertical);
   if (!dpi_horizontal.has_value() || !dpi_vertical.has_value())
     return nullptr;
   settings->set_dpi_xy(dpi_horizontal.value(), dpi_vertical.value());
 
   absl::optional<int> rasterize_pdf_dpi =
-      job_settings.FindIntKey(kSettingRasterizePdfDpi);
+      job_settings.FindInt(kSettingRasterizePdfDpi);
   if (rasterize_pdf_dpi.has_value())
     settings->set_rasterize_pdf_dpi(rasterize_pdf_dpi.value());
 
@@ -204,7 +202,7 @@
   settings->set_copies(copies.value());
   settings->SetOrientation(landscape.value());
   settings->set_device_name(
-      base::UTF8ToUTF16(*job_settings.FindStringKey(kSettingDeviceName)));
+      base::UTF8ToUTF16(*job_settings.FindString(kSettingDeviceName)));
   settings->set_duplex_mode(
       static_cast<mojom::DuplexMode>(duplex_mode.value()));
   settings->set_color(static_cast<mojom::ColorModel>(color.value()));
@@ -212,16 +210,16 @@
   settings->set_rasterize_pdf(rasterize_pdf.value());
   settings->set_pages_per_sheet(pages_per_sheet.value());
   absl::optional<bool> is_modifiable =
-      job_settings.FindBoolKey(kSettingPreviewModifiable);
+      job_settings.FindBool(kSettingPreviewModifiable);
   if (is_modifiable.has_value()) {
     settings->set_is_modifiable(is_modifiable.value());
   }
 
 #if BUILDFLAG(IS_CHROMEOS) || (BUILDFLAG(IS_LINUX) && defined(USE_CUPS))
-  const base::Value* advanced_settings =
-      job_settings.FindDictKey(kSettingAdvancedSettings);
+  const base::Value::Dict* advanced_settings =
+      job_settings.FindDict(kSettingAdvancedSettings);
   if (advanced_settings) {
-    for (const auto item : advanced_settings->DictItems()) {
+    for (const auto item : *advanced_settings) {
       static constexpr auto kNonJobAttributes =
           base::MakeFixedFlatSet<base::StringPiece>(
               {"printer-info", "printer-make-and-model", "system_driverinfo"});
@@ -233,15 +231,15 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
   bool send_user_info =
-      job_settings.FindBoolKey(kSettingSendUserInfo).value_or(false);
+      job_settings.FindBool(kSettingSendUserInfo).value_or(false);
   settings->set_send_user_info(send_user_info);
   if (send_user_info) {
-    const std::string* username = job_settings.FindStringKey(kSettingUsername);
+    const std::string* username = job_settings.FindString(kSettingUsername);
     if (username)
       settings->set_username(*username);
   }
 
-  const std::string* pin_value = job_settings.FindStringKey(kSettingPinValue);
+  const std::string* pin_value = job_settings.FindString(kSettingPinValue);
   if (pin_value)
     settings->set_pin_value(*pin_value);
 #endif  // BUILDFLAG(IS_CHROMEOS)
