diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 698cc8105f4bafa9f7855516003046e88ba43ab8..0d23b74502e92a4200fc6a4875c70d28352fdbd5 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,5 @@
 #####################################################################################
-# (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations #
+# (c) Copyright 1998-2020 CERN for the benefit of the LHCb and ATLAS collaborations #
 #                                                                                   #
 # This software is distributed under the terms of the Apache version 2 licence,     #
 # copied verbatim in the file "LICENSE".                                            #
@@ -85,9 +85,8 @@ build:gcc9:opt:python3:
   tags:
     - cvmfs
   variables:
-    BINARY_TAG: x86_64-centos7-gcc9-opt
+    BINARY_TAG: x86_64-centos7-gcc9+py3-opt
     BUILDDIR: build-opt-python3
-    HEPTOOLS_VERSION: 97apython3
   script:
     - ci-utils/build
   artifacts:
@@ -203,7 +202,7 @@ test:gcc9:opt:python3:
   tags:
     - cvmfs
   variables:
-    BINARY_TAG: x86_64-centos7-gcc9-opt
+    BINARY_TAG: x86_64-centos7-gcc9+py3-opt
     BUILDDIR: build-opt-python3
   script:
     - ci-utils/test
diff --git a/ci-utils/build b/ci-utils/build
index 571912be6232824f244b34b81c3597330b6561b7..136a740c7bfce040b21c0ae1674683e5a3457045 100755
--- a/ci-utils/build
+++ b/ci-utils/build
@@ -1,6 +1,6 @@
 #!/bin/bash -e
 #####################################################################################
-# (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations #
+# (c) Copyright 1998-2020 CERN for the benefit of the LHCb and ATLAS collaborations #
 #                                                                                   #
 # This software is distributed under the terms of the Apache version 2 licence,     #
 # copied verbatim in the file "LICENSE".                                            #
@@ -12,7 +12,7 @@
 
 . $(dirname $0)/env_setup.sh
 
-${LCG_release_area}/ccache/${CCACHE_VERSION}/${BINARY_TAG}/bin/ccache -z -F 2000
+${LCG_release_area}/ccache/${CCACHE_VERSION}/${BINARY_TAG/+py3/}/bin/ccache -z -F 2000
 
 echo 'set(CMAKE_USE_CCACHE ON CACHE BOOL "")' >> cache_preload.cmake
 
@@ -22,4 +22,4 @@ echo 'set(CMAKE_USE_CCACHE ON CACHE BOOL "")' >> cache_preload.cmake
   make BUILDDIR=${BUILDDIR}
 "
 
-${LCG_release_area}/ccache/${CCACHE_VERSION}/${BINARY_TAG}/bin/ccache -s
+${LCG_release_area}/ccache/${CCACHE_VERSION}/${BINARY_TAG/+py3/}/bin/ccache -s
diff --git a/cmake/BinaryTagUtils.cmake b/cmake/BinaryTagUtils.cmake
index 251fa36be8d62173d4af83a67073b4fedc0d9ec7..c1142f4612dfe732dcf5fa480d8e83ecbe9e827c 100644
--- a/cmake/BinaryTagUtils.cmake
+++ b/cmake/BinaryTagUtils.cmake
@@ -1,5 +1,5 @@
 #####################################################################################
-# (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations #
+# (c) Copyright 1998-2020 CERN for the benefit of the LHCb and ATLAS collaborations #
 #                                                                                   #
 # This software is distributed under the terms of the Apache version 2 licence,     #
 # copied verbatim in the file "LICENSE".                                            #
@@ -114,6 +114,11 @@ macro(parse_binary_tag)
     set(${_variable}_MICROARCH)
   endif()
 
+  if(${_variable}_COMP MATCHES "\\+")
+    string(REGEX MATCHALL "[^+]+" ${_variable}_COMP_SUBTYPE "${${_variable}_COMP}")
+    list(GET ${_variable}_COMP_SUBTYPE 0 ${_variable}_COMP)
+    list(REMOVE_AT ${_variable}_COMP_SUBTYPE 0)
+  endif()
   if(${_variable}_COMP MATCHES "([^0-9.]+)([0-9.]+)")
     set(${_variable}_COMP_NAME    ${CMAKE_MATCH_1})
     set(${_variable}_COMP_VERSION ${CMAKE_MATCH_2})
@@ -277,6 +282,17 @@ function(compatible_binary_tags variable)
   # - finally reverse the list
   list(REVERSE archs)
 
+  # prepare the list of compiler sub-types (if needed)
+  set(comps ${BINARY_TAG_COMP})
+  if(BINARY_TAG_COMP_SUBTYPE)
+    set(subtype ${BINARY_TAG_COMP})
+    foreach(st ${BINARY_TAG_COMP_SUBTYPE})
+      set(subtype "${subtype}+${st}")
+      list(APPEND comps "${subtype}")
+    endforeach()
+    list(REVERSE comps)
+  endif()
+
   # prepare the list of build sub-types (if needed)
   set(subtypes)
   if(BINARY_TAG_SUBTYPE)
@@ -291,11 +307,13 @@ function(compatible_binary_tags variable)
   set(out)
   foreach(a ${archs})
     foreach(t ${types})
-      foreach(st ${subtypes})
-        list(APPEND out "${a}-${BINARY_TAG_OS}-${BINARY_TAG_COMP}-${t}${st}")
+      foreach(c ${comps})
+        foreach(st ${subtypes})
+          list(APPEND out "${a}-${BINARY_TAG_OS}-${c}-${t}${st}")
+        endforeach()
+        # the list of subtypes might be empty, so we explicitly add the simple tag
+        list(APPEND out "${a}-${BINARY_TAG_OS}-${c}-${t}")
       endforeach()
-      # the list of subtypes might be empty, so we explicitly add the simple tag
-      list(APPEND out "${a}-${BINARY_TAG_OS}-${BINARY_TAG_COMP}-${t}")
     endforeach()
   endforeach()
 
diff --git a/cmake/UseHEPTools.cmake b/cmake/UseHEPTools.cmake
index 786eba45b2595be06f82e9294ee578a23aaa1c78..ea4b0a227284e46a06a87f7b619c887609a7d88b 100644
--- a/cmake/UseHEPTools.cmake
+++ b/cmake/UseHEPTools.cmake
@@ -1,5 +1,5 @@
 #####################################################################################
-# (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations #
+# (c) Copyright 1998-2020 CERN for the benefit of the LHCb and ATLAS collaborations #
 #                                                                                   #
 # This software is distributed under the terms of the Apache version 2 licence,     #
 # copied verbatim in the file "LICENSE".                                            #
@@ -37,18 +37,24 @@ macro(use_heptools heptools_version)
                             LCG_externals_${LCG_SYSTEM}-opt.txt)
   endif()
 
+  if("${BINARY_TAG_COMP_SUBTYPE}" MATCHES "py3")
+    set(_lcg_py3 python3)
+  else()
+    set(_lcg_py3)
+  endif()
+
   # Find the toolchain description
   find_file(LCG_TOOLCHAIN_INFO
             NAMES ${_info_names}
             HINTS ENV CMTPROJECTPATH
-            PATH_SUFFIXES LCG_${heptools_version})
+            PATH_SUFFIXES LCG_${heptools_version}${_lcg_py3})
 
   if(LCG_TOOLCHAIN_INFO)
     message(STATUS "Using heptools ${heptools_version} from ${LCG_TOOLCHAIN_INFO}")
 
     get_filename_component(LCG_releases ${LCG_TOOLCHAIN_INFO} PATH CACHE)
     set(LCG_external ${LCG_releases})
-    if(LCG_releases MATCHES "LCG_${heptools_version}\$")
+    if(LCG_releases MATCHES "LCG_${heptools_version}${_lcg_py3}\$")
       get_filename_component(LCG_releases_base ${LCG_releases} PATH)
     else()
       set(LCG_releases_base ${LCG_releases})
@@ -93,7 +99,7 @@ macro(use_heptools heptools_version)
     #    CACHE FILEPATH "The CMake toolchain file" FORCE)
 
   else()
-    message(FATAL_ERROR "Cannot find heptools ${heptools_version}.")
+    message(FATAL_ERROR "Cannot find heptools ${heptools_version} (using suffix LCG_${heptools_version}${_lcg_py3}).")
   endif()
 
 endmacro()