diff --git a/lib/config/validation.js b/lib/config/validation.js
index 3eb263ad1c4025947b182b09a8c58f59f900464c..4a8fa81658de5b22ae1ac17a97b761ed7134dcba 100644
--- a/lib/config/validation.js
+++ b/lib/config/validation.js
@@ -1,5 +1,5 @@
 const options = require('./definitions').getOptions();
-const { isValidSemver } = require('../util/semver');
+const { isValidSemver } = require('../versioning/semver');
 const { resolveConfigPresets } = require('./presets');
 const {
   hasValidSchedule,
diff --git a/lib/datasource/github.js b/lib/datasource/github.js
index d04d68ace1fdc68dfb7a09dad0f40508b26fae86..f0c1a847921a8f6c85752ce145605b05bbfe59c8 100644
--- a/lib/datasource/github.js
+++ b/lib/datasource/github.js
@@ -1,5 +1,5 @@
 const ghGot = require('../platform/github/gh-got-wrapper');
-const { isPinnedVersion, semverSort } = require('../util/semver');
+const { isPinnedVersion, semverSort } = require('../versioning/semver');
 
 module.exports = {
   getRepoTags,
diff --git a/lib/manager/_helpers/node/package.js b/lib/manager/_helpers/node/package.js
index dd342fa45e8158ae5902711796ac0c45b8de2757..2735115fec087cf392e2bcd7a084c40d9a4b5dc7 100644
--- a/lib/manager/_helpers/node/package.js
+++ b/lib/manager/_helpers/node/package.js
@@ -3,7 +3,7 @@ const {
   getMinor,
   isGreaterThan,
   isPinnedVersion,
-} = require('../../../util/semver');
+} = require('../../../versioning/semver');
 const { getRepoTags, semverSort } = require('../../../datasource/github');
 
 async function getPackageUpdates(config) {
diff --git a/lib/manager/bazel/package.js b/lib/manager/bazel/package.js
index 79596241980487d0bd628f19ffe62bf12a5a740e..41ad40b64d3d8b11e107a482cf15d4784db60cb4 100644
--- a/lib/manager/bazel/package.js
+++ b/lib/manager/bazel/package.js
@@ -3,7 +3,7 @@ const {
   isGreaterThan,
   isStable,
   isPinnedVersion,
-} = require('../../util/semver');
+} = require('../../versioning/semver');
 const { getRepoTags, getRepoReleases } = require('../../datasource/github');
 
 module.exports = {
diff --git a/lib/manager/buildkite/package.js b/lib/manager/buildkite/package.js
index 7d6f0c928cfa3db91a6332e243cdc65ed4b34ec8..20ddd6ab7c6556d8e82a8eae981ee9dd747146ef 100644
--- a/lib/manager/buildkite/package.js
+++ b/lib/manager/buildkite/package.js
@@ -4,7 +4,7 @@ const {
   semverSort,
   getMajor,
   getMinor,
-} = require('../../util/semver');
+} = require('../../versioning/semver');
 const { getRepoTags } = require('../../datasource/github');
 
 module.exports = {
diff --git a/lib/manager/docker/package.js b/lib/manager/docker/package.js
index c0fb3ec35dbc21484de63fc65abbd4dc412d8b51..67d5f1f9022f5933e1402f936b806b2e1e1f283f 100644
--- a/lib/manager/docker/package.js
+++ b/lib/manager/docker/package.js
@@ -1,4 +1,4 @@
-const { getMajor, isValidSemver } = require('../../util/semver');
+const { getMajor, isValidSemver } = require('../../versioning/semver');
 const dockerApi = require('../../datasource/docker');
 const compareVersions = require('compare-versions');
 
diff --git a/lib/manager/npm/package.js b/lib/manager/npm/package.js
index 92173142b12cf01648fd449f123c80012e9a1b45..cfa17a378b18f1ce15c91701e851ba123a47a89a 100644
--- a/lib/manager/npm/package.js
+++ b/lib/manager/npm/package.js
@@ -1,8 +1,8 @@
 const npmApi = require('../../datasource/npm');
 const versions = require('./versions');
-const { isValidSemver } = require('../../util/semver');
+const { isValidSemver } = require('../../versioning/semver');
 const nodeManager = require('../_helpers/node/package');
-const { parseRange } = require('../../util/semver');
+const { parseRange } = require('../../versioning/semver');
 
 module.exports = {
   getRangeStrategy,
diff --git a/lib/manager/npm/versions.js b/lib/manager/npm/versions.js
index 4b33eba8ae94c0039fbf9b87cc498feace1f925a..5bad66816257c5f7f95a1b20440ac2c29853a890 100644
--- a/lib/manager/npm/versions.js
+++ b/lib/manager/npm/versions.js
@@ -14,7 +14,7 @@ const {
   parseRange,
   parseVersion,
   stringifyRange,
-} = require('../../util/semver');
+} = require('../../versioning/semver');
 const moment = require('moment');
 
 module.exports = {
diff --git a/lib/manager/pip_requirements/package.js b/lib/manager/pip_requirements/package.js
index 4d92d90bfd7227e85d0b154164628f1b3e64a16e..d11a8cdf3894c550c36fb5fbea7c37cba014bbb1 100644
--- a/lib/manager/pip_requirements/package.js
+++ b/lib/manager/pip_requirements/package.js
@@ -4,7 +4,7 @@ const {
   semverSort,
   isPinnedVersion,
   getMajor,
-} = require('../../util/semver');
+} = require('../../versioning/semver');
 
 module.exports = {
   getPackageUpdates,
diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.js
index 4ecc30c3183d557d437c3225ac96edbf41edec62..c6c302ad5691b3462fa2bc82293dcfb0c9ee86bb 100644
--- a/lib/manager/travis/package.js
+++ b/lib/manager/travis/package.js
@@ -1,6 +1,9 @@
 const { isEqual } = require('lodash');
 const { getRepoReleases } = require('../../datasource/github');
-const { isPinnedVersion, maxSatisfyingVersion } = require('../../util/semver');
+const {
+  isPinnedVersion,
+  maxSatisfyingVersion,
+} = require('../../versioning/semver');
 
 module.exports = {
   getPackageUpdates,
diff --git a/lib/util/package-rules.js b/lib/util/package-rules.js
index 6e58eeeb20104b7633efc2493064caaffdd9aad9..8d4e8312d3d81d2acdf5fcf716dcc7e5946814fd 100644
--- a/lib/util/package-rules.js
+++ b/lib/util/package-rules.js
@@ -1,6 +1,6 @@
 const minimatch = require('minimatch');
 
-const { intersectsSemver } = require('./semver');
+const { intersectsSemver } = require('../versioning/semver');
 const { mergeChildConfig } = require('../config');
 
 module.exports = {
diff --git a/lib/util/semver.js b/lib/versioning/semver/index.js
similarity index 100%
rename from lib/util/semver.js
rename to lib/versioning/semver/index.js
diff --git a/lib/workers/pr/changelog/manager-npm.js b/lib/workers/pr/changelog/manager-npm.js
index 6fe3da21701068b6ad66ddd366412c84b65142f8..3c49d4b8b58d4c384596116348a465f348d7e476 100644
--- a/lib/workers/pr/changelog/manager-npm.js
+++ b/lib/workers/pr/changelog/manager-npm.js
@@ -1,5 +1,5 @@
 const npmRegistry = require('../../../datasource/npm');
-const { semverSort } = require('../../../util/semver');
+const { semverSort } = require('../../../versioning/semver');
 
 module.exports = {
   getPackage,
diff --git a/lib/workers/pr/changelog/manager-pip.js b/lib/workers/pr/changelog/manager-pip.js
index 404f1e0d707d43faaa84e56b1b7e03fef9da8351..c1dc02d5f9162bcd03d2b482b7364a7e880ea03d 100644
--- a/lib/workers/pr/changelog/manager-pip.js
+++ b/lib/workers/pr/changelog/manager-pip.js
@@ -1,5 +1,5 @@
 const got = require('got');
-const { semverSort, isPinnedVersion } = require('../../../util/semver');
+const { semverSort, isPinnedVersion } = require('../../../versioning/semver');
 
 module.exports = {
   getPackage,
diff --git a/lib/workers/pr/changelog/source-github.js b/lib/workers/pr/changelog/source-github.js
index 6a61089eff941367e721b58c99054037988c0e74..3ad8ac2d457be781edd035499514acacf1423a37 100644
--- a/lib/workers/pr/changelog/source-github.js
+++ b/lib/workers/pr/changelog/source-github.js
@@ -1,4 +1,7 @@
-const { matchesSemver, isPinnedVersion } = require('../../../util/semver');
+const {
+  matchesSemver,
+  isPinnedVersion,
+} = require('../../../versioning/semver');
 const ghGot = require('../../../platform/github/gh-got-wrapper');
 
 module.exports = {
diff --git a/test/util/semver.spec.js b/test/util/semver.spec.js
index bfd5c79a4ab506bb0988f6be1a9f537864918a64..814b0cb23cd6406965e910302f2b5a44df0ab28c 100644
--- a/test/util/semver.spec.js
+++ b/test/util/semver.spec.js
@@ -1,4 +1,4 @@
-const semver = require('../../lib/util/semver');
+const semver = require('../../lib/versioning/semver');
 
 describe('.isValidSemver(input)', () => {
   it('should return null for irregular versions', () => {