diff --git a/core/lib/Drupal/Core/Config/Config.php b/core/lib/Drupal/Core/Config/Config.php
index 19b42f0..d0376db 100644
--- a/core/lib/Drupal/Core/Config/Config.php
+++ b/core/lib/Drupal/Core/Config/Config.php
@@ -209,18 +209,17 @@ public function save($has_trusted_data = FALSE) {
 
     // If there is a schema for this configuration object, cast all values to
     // conform to the schema.
-    if (!$has_trusted_data) {
-      if ($this->typedConfigManager->hasConfigSchema($this->name)) {
-        // Ensure that the schema wrapper has the latest data.
-        $this->schemaWrapper = NULL;
-        foreach ($this->data as $key => $value) {
-          $this->data[$key] = $this->castValue($key, $value);
-        }
+    if (!$has_trusted_data && $this->typedConfigManager->hasConfigSchema($this->name)) {
+      // Ensure that the schema wrapper has the latest data.
+      $this->schemaWrapper = NULL;
+      foreach ($this->data as $key => $value) {
+        $this->data[$key] = $this->castValue($key, $value);
       }
-      else {
-        foreach ($this->data as $key => $value) {
-          $this->validateValue($key, $value);
-        }
+    }
+    else {
+      // We fall back to simple validation.
+      foreach ($this->data as $key => $value) {
+        $this->validateValue($key, $value);
       }
     }
 
diff --git a/core/lib/Drupal/Core/Config/StorableConfigBase.php b/core/lib/Drupal/Core/Config/StorableConfigBase.php
index a0ad7a2..6e488ae 100644
--- a/core/lib/Drupal/Core/Config/StorableConfigBase.php
+++ b/core/lib/Drupal/Core/Config/StorableConfigBase.php
@@ -12,6 +12,7 @@
 use Drupal\Core\TypedData\Type\FloatInterface;
 use Drupal\Core\TypedData\Type\IntegerInterface;
 use Drupal\Core\Config\Schema\Undefined;
+use Drupal\Component\Utility\SafeStringInterface;
 
 /**
  * Provides a base class for configuration objects with storage support.
@@ -142,7 +143,10 @@ protected function getSchemaWrapper() {
   }
 
   /**
-   * Validate the values are allowed data types.
+   * Validate the values are allowed data types and perform minimal casting.
+   *
+   * We only cast objects implementing SafeStringInterface to string here. This
+   * may be useful when TranslationWrappers exist in configuration.
    *
    * @param string $key
    *   A string that maps to a key within the configuration data.
@@ -155,15 +159,20 @@ protected function getSchemaWrapper() {
    *   If the value is unsupported in configuration.
    */
   protected function validateValue($key, $value) {
+    if ($value instanceof SafeStringInterface) {
+      $value = (string) $value;
+    }
+
     // Minimal validation. Should not try to serialize resources or non-arrays.
     if (is_array($value)) {
       foreach ($value as $nested_value_key => $nested_value) {
-        $this->validateValue($key . '.' . $nested_value_key, $nested_value);
+        $value[$nested_value_key] = $this->validateValue($key . '.' . $nested_value_key, $nested_value);
       }
     }
     elseif ($value !== NULL && !is_scalar($value)) {
       throw new UnsupportedDataTypeConfigException("Invalid data type for config element {$this->getName()}:$key");
     }
+    return $value;
   }
 
   /**
@@ -182,6 +191,11 @@ protected function validateValue($key, $value) {
    */
   protected function castValue($key, $value) {
     $element = $this->getSchemaWrapper()->get($key);
+    // Cast objects implementing SafeStringInterface to string so we can
+    // use TranslationWrappers as config values.
+    if ($value instanceof SafeStringInterface) {
+      $value = (string) $value;
+    }
     // Do not cast value if it is unknown or defined to be ignored.
     if ($element && ($element instanceof Undefined || $element instanceof Ignore)) {
       // Do validate the value (may throw UnsupportedDataTypeConfigException)
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/BooleanItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/BooleanItem.php
index 7107436..34ebe4a 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/BooleanItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/BooleanItem.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\StringTranslation\TranslationWrapper;
 use Drupal\Core\TypedData\OptionsProviderInterface;
 use Drupal\Core\TypedData\DataDefinition;
 
@@ -33,8 +34,8 @@ class BooleanItem extends FieldItemBase implements OptionsProviderInterface {
    */
   public static function defaultFieldSettings() {
     return array(
-      'on_label' => t('On'),
-      'off_label' => t('Off'),
+      'on_label' => new TranslationWrapper('On'),
+      'off_label' => new TranslationWrapper('Off'),
     ) + parent::defaultFieldSettings();
   }
 
