diff --git a/lib/config/definitions.js b/lib/config/definitions.js
index 77aa0b51359560834c401f10a37bcef6d71a486d..05191aeeaaa493ab53c47ae5feb41261547cc82a 100644
--- a/lib/config/definitions.js
+++ b/lib/config/definitions.js
@@ -65,6 +65,7 @@ const options = [
     name: 'schedule',
     description: 'Times of day/week to renovate',
     type: 'list',
+    allowString: true,
     cli: false,
     env: false,
   },
@@ -201,6 +202,7 @@ const options = [
     description:
       'Package names to match. Valid only within `packageRules` object',
     type: 'list',
+    allowString: true,
     stage: 'depType',
     cli: false,
     env: false,
@@ -210,6 +212,7 @@ const options = [
     description:
       'Package names to exclude. Valid only within `packageRules` object',
     type: 'list',
+    allowString: true,
     stage: 'depType',
     cli: false,
     env: false,
@@ -219,6 +222,7 @@ const options = [
     description:
       'Package name patterns to match. Valid only within `packageRules` object.',
     type: 'list',
+    allowString: true,
     stage: 'depType',
     cli: false,
     env: false,
@@ -228,6 +232,7 @@ const options = [
     description:
       'Package name patterns to exclude. Valid only within `packageRules` object.',
     type: 'list',
+    allowString: true,
     stage: 'depType',
     cli: false,
     env: false,
diff --git a/lib/config/massage.js b/lib/config/massage.js
new file mode 100644
index 0000000000000000000000000000000000000000..780fbcce2d86c71db9d18fa5db753ad07c24993d
--- /dev/null
+++ b/lib/config/massage.js
@@ -0,0 +1,30 @@
+const options = require('./definitions').getOptions();
+
+const allowedStrings = [];
+options.forEach(option => {
+  if (option.allowString) {
+    allowedStrings.push(option.name);
+  }
+});
+
+module.exports = {
+  massageConfig,
+};
+
+// Returns a massaged config
+function massageConfig(config) {
+  const massagedConfig = { ...config };
+  for (const key of Object.keys(config)) {
+    const val = config[key];
+    if (allowedStrings.includes(key) && typeof val === 'string') {
+      massagedConfig[key] = [val];
+    } else if (isObject(val)) {
+      massagedConfig[key] = massageConfig(val);
+    }
+  }
+  return massagedConfig;
+}
+
+function isObject(obj) {
+  return Object.prototype.toString.call(obj) === '[object Object]';
+}
diff --git a/lib/config/migration.js b/lib/config/migration.js
index b5dbd7bab04ef22a097fd77b61cff7d2588283eb..fff7d460f41aea02e6d2edde38ed325b38b5df9c 100644
--- a/lib/config/migration.js
+++ b/lib/config/migration.js
@@ -30,9 +30,6 @@ function migrateConfig(config, parentConfig) {
         isMigrated = true;
         delete migratedConfig[key];
       }
-    } else if (key === 'schedule' && typeof val === 'string') {
-      isMigrated = true;
-      migratedConfig.schedule = [val];
     } else if (key === 'packages') {
       isMigrated = true;
       migratedConfig.packageRules = migratedConfig.packages.map(
diff --git a/lib/workers/repository/apis.js b/lib/workers/repository/apis.js
index ac97d7b6ad788a2ab8c61162d7e0b7d397713feb..a90bb92fc59a9576124503dface9d1d3a3a5b1dc 100644
--- a/lib/workers/repository/apis.js
+++ b/lib/workers/repository/apis.js
@@ -4,6 +4,7 @@ const path = require('path');
 const jsonValidator = require('json-dup-key-validator');
 const configParser = require('../../config');
 const configMigration = require('../../config/migration');
+const configMassage = require('../../config/massage');
 const configValidation = require('../../config/validation');
 // API
 const githubApi = require('../../api/github');
@@ -108,13 +109,14 @@ function migrateAndValidate(config, input) {
       'Config migration necessary'
     );
   }
-  const { warnings, errors } = configValidation.validateConfig(migratedConfig);
+  const massagedConfig = configMassage.massageConfig(migratedConfig);
+  const { warnings, errors } = configValidation.validateConfig(massagedConfig);
   // istanbul ignore if
   if (warnings.length) {
-    config.logger.debug({ warnings }, 'Found renovate.json warnings');
+    config.logger.debug({ warnings }, 'Found renovate config warnings');
   }
   if (errors.length) {
-    config.logger.warn({ errors }, 'Found renovate.json errors');
+    config.logger.warn({ errors }, 'Found renovate config errors');
     /* TODO #556
     renovateJsonErrors.forEach(error => {
       config.errors.push(
diff --git a/test/config/__snapshots__/migration.spec.js.snap b/test/config/__snapshots__/migration.spec.js.snap
index b1571c58b013a29902470b7ea5e8329b6edca686..da1984e40a40e61d0bf81acbacbf605b953f74fb 100644
--- a/test/config/__snapshots__/migration.spec.js.snap
+++ b/test/config/__snapshots__/migration.spec.js.snap
@@ -19,9 +19,7 @@ Object {
     },
   ],
   "prTitle": "some pr title",
-  "schedule": Array [
-    "after 5pm",
-  ],
+  "schedule": "after 5pm",
   "semanticPrefix": "fix(deps):",
 }
 `;
diff --git a/test/workers/repository/apis.spec.js b/test/workers/repository/apis.spec.js
index 1c19c77cfdaf3413d6bda678d8fcc658910ca116..48e42687de90bdf34d76e3e28b8914fdcf9aff29 100644
--- a/test/workers/repository/apis.spec.js
+++ b/test/workers/repository/apis.spec.js
@@ -160,7 +160,7 @@ describe('workers/repository/apis', () => {
     });
     it('returns warning + error plus extended config if unknown keys', async () => {
       config.api.getFileContent.mockReturnValueOnce(
-        '{ "enabled": true, "foo": false, "maintainYarnLock": true }'
+        '{ "enabled": true, "foo": false, "maintainYarnLock": true, "schedule": "before 5am", "minor": {} }'
       );
       const returnConfig = await apis.mergeRenovateJson(config);
       expect(returnConfig.enabled).toBe(true);