diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp
index 6364b65c14b7f8570e9e89ca4a34e21b1efdc40b..d060483ce1714bbc1c07c145cd34b656df9d90ff 100644
--- a/source/App/EncoderApp/EncAppCfg.cpp
+++ b/source/App/EncoderApp/EncAppCfg.cpp
@@ -2490,27 +2490,27 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] )
     }
   }
 
-  if (tmpDecodedPictureHashSEIMappedType<0 || tmpDecodedPictureHashSEIMappedType>=int(NUMBER_OF_HASHTYPES))
+  if (tmpDecodedPictureHashSEIMappedType < 0 || tmpDecodedPictureHashSEIMappedType > to_underlying(HashType::NUM))
   {
     EXIT( "Error: bad checksum mode");
   }
   // Need to map values to match those of the SEI message:
   if (tmpDecodedPictureHashSEIMappedType==0)
   {
-    m_decodedPictureHashSEIType=HASHTYPE_NONE;
+    m_decodedPictureHashSEIType = HashType::NONE;
   }
   else
   {
-    m_decodedPictureHashSEIType=HashType(tmpDecodedPictureHashSEIMappedType-1);
+    m_decodedPictureHashSEIType = static_cast<HashType>(tmpDecodedPictureHashSEIMappedType - 1);
   }
   // Need to map values to match those of the SEI message:
   if (tmpSubpicDecodedPictureHashMappedType==0)
   {
-    m_subpicDecodedPictureHashType=HASHTYPE_NONE;
+    m_subpicDecodedPictureHashType = HashType::NONE;
   }
   else
   {
-    m_subpicDecodedPictureHashType=HashType(tmpSubpicDecodedPictureHashMappedType-1);
+    m_subpicDecodedPictureHashType = static_cast<HashType>(tmpSubpicDecodedPictureHashMappedType - 1);
   }
   // allocate slice-based dQP values
   m_frameDeltaQps.resize(m_framesToBeEncoded + m_iGOPSize + 1);
@@ -3367,7 +3367,7 @@ int EncAppCfg::xAutoDetermineProfile()
 bool EncAppCfg::xCheckParameter()
 {
   msg( NOTICE, "\n" );
-  if (m_decodedPictureHashSEIType==HASHTYPE_NONE)
+  if (m_decodedPictureHashSEIType == HashType::NONE)
   {
     msg( DETAILS, "******************************************************************\n");
     msg( DETAILS, "** WARNING: --SEIDecodedPictureHash is now disabled by default. **\n");
diff --git a/source/Lib/CommonLib/PicYuvMD5.cpp b/source/Lib/CommonLib/PicYuvMD5.cpp
index c0a92aaf2fcc68cff9158de4048d0b02023642b4..714e6dc6dedef88126ab7e3c73d47875ff696965 100644
--- a/source/Lib/CommonLib/PicYuvMD5.cpp
+++ b/source/Lib/CommonLib/PicYuvMD5.cpp
@@ -256,29 +256,29 @@ int calcAndPrintHashStatus(const CPelUnitBuf& pic, const SEIDecodedPictureHash*
     CHECK ((uint32_t)pic.bufs.size() != ( pictureHashSEI->singleCompFlag ? 1 : 3 ), "The value of dph_sei_single_component_flag shall be equal to (ChromaFormatIdc == 0).");
     switch (pictureHashSEI->method)
     {
-      case HASHTYPE_MD5:
-        {
-          hashType = "MD5";
-          numChar = calcMD5(pic, recon_digest, bitDepths);
-          break;
-        }
-      case HASHTYPE_CRC:
-        {
-          hashType = "CRC";
-          numChar = calcCRC(pic, recon_digest, bitDepths);
-          break;
-        }
-      case HASHTYPE_CHECKSUM:
-        {
-          hashType = "Checksum";
-          numChar = calcChecksum(pic, recon_digest, bitDepths);
-          break;
-        }
-      default:
-        {
-          THROW("Unknown hash type");
-          break;
-        }
+    case HashType::MD5:
+    {
+      hashType = "MD5";
+      numChar  = calcMD5(pic, recon_digest, bitDepths);
+      break;
+    }
+    case HashType::CRC:
+    {
+      hashType = "CRC";
+      numChar  = calcCRC(pic, recon_digest, bitDepths);
+      break;
+    }
+    case HashType::CHECKSUM:
+    {
+      hashType = "Checksum";
+      numChar  = calcChecksum(pic, recon_digest, bitDepths);
+      break;
+    }
+    default:
+    {
+      THROW("Unknown hash type");
+      break;
+    }
     }
   }
 
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index bad0b30ef3fccdf9993935c2517d4e7cbba5313d..5c354741203edc7818faea96666dd1bbe7387c61 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -633,13 +633,13 @@ enum ScalingList1dStartIdx
 };
 
 // For use with decoded picture hash SEI messages, generated by encoder.
-enum HashType
+enum class HashType
 {
-  HASHTYPE_MD5             = 0,
-  HASHTYPE_CRC             = 1,
-  HASHTYPE_CHECKSUM        = 2,
-  HASHTYPE_NONE            = 3,
-  NUMBER_OF_HASHTYPES      = 4
+  NONE     = -1,
+  MD5      = 0,
+  CRC      = 1,
+  CHECKSUM = 2,
+  NUM
 };
 
 enum SAOMode //mode
diff --git a/source/Lib/DecoderLib/SEIread.cpp b/source/Lib/DecoderLib/SEIread.cpp
index da72f7d3a147c78e40610b1c1ae62c5fb4ab1698..6b630d43c44ae6dac0dc3ce087437773e6939717 100644
--- a/source/Lib/DecoderLib/SEIread.cpp
+++ b/source/Lib/DecoderLib/SEIread.cpp
@@ -641,16 +641,25 @@ void SEIReader::xParseSEIDecodedPictureHash(SEIDecodedPictureHash& sei, uint32_t
   sei.singleCompFlag = val;
   sei_read_code( pDecodedMessageOutputStream, 7, val, "dph_sei_reserved_zero_7bits");
   bytesRead++;
-  uint32_t expectedSize = ( sei.singleCompFlag ? 1 : 3 ) * (sei.method == 0 ? 16 : (sei.method == 1 ? 2 : 4));
+  uint32_t expectedSize =
+    (sei.singleCompFlag ? 1 : 3) * (sei.method == HashType::MD5 ? 16 : (sei.method == HashType::CRC ? 2 : 4));
   CHECK ((payloadSize - bytesRead) != expectedSize, "The size of the decoded picture hash does not match the expected size.");
 
   const char *traceString="\0";
   switch (sei.method)
   {
-    case HASHTYPE_MD5: traceString="picture_md5"; break;
-    case HASHTYPE_CRC: traceString="picture_crc"; break;
-    case HASHTYPE_CHECKSUM: traceString="picture_checksum"; break;
-    default: THROW("Unknown hash type"); break;
+  case HashType::MD5:
+    traceString = "picture_md5";
+    break;
+  case HashType::CRC:
+    traceString = "picture_crc";
+    break;
+  case HashType::CHECKSUM:
+    traceString = "picture_checksum";
+    break;
+  default:
+    THROW("Unknown hash type");
+    break;
   }
 
   if (pDecodedMessageOutputStream)
diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index a12333733dc260f87e0d5844a8cd44e447ecbff2..20b3d06a79695c3a82c145f1b23e97ff5c6faebe 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -1288,7 +1288,7 @@ void EncGOP::xUpdateDuData(AccessUnit &testAU, std::deque<DUData> &duData)
   }
 
   // The last DU may have a trailing SEI
-  if (m_pcCfg->getDecodedPictureHashSEIType()!=HASHTYPE_NONE)
+  if (m_pcCfg->getDecodedPictureHashSEIType() != HashType::NONE)
   {
     duData.back().accumBitsDU += ( 20 << 3 ); // probably around 20 bytes - should be further adjusted, e.g. by type
     duData.back().accumNalsDU += 1;
@@ -1647,16 +1647,18 @@ printHash(const HashType hashType, const std::string &digestStr)
   const char *decodedPictureHashModeName;
   switch (hashType)
   {
-    case HASHTYPE_MD5:
-      decodedPictureHashModeName = "MD5";
-      break;
-    case HASHTYPE_CRC:
-      decodedPictureHashModeName = "CRC";
-      break;
-    case HASHTYPE_CHECKSUM:
-      decodedPictureHashModeName = "Checksum";
-      break;
-    default: decodedPictureHashModeName = nullptr; break;
+  case HashType::MD5:
+    decodedPictureHashModeName = "MD5";
+    break;
+  case HashType::CRC:
+    decodedPictureHashModeName = "CRC";
+    break;
+  case HashType::CHECKSUM:
+    decodedPictureHashModeName = "Checksum";
+    break;
+  default:
+    decodedPictureHashModeName = nullptr;
+    break;
   }
   if (decodedPictureHashModeName != nullptr)
   {
@@ -4059,9 +4061,9 @@ void EncGOP::compressGOP(int pocLast, int numPicRcvd, PicList &rcListPic, std::l
 #if GDR_ENABLED
       // note : generate hash sei only for non-gdr pictures
       bool genHash = !(m_pcCfg->getGdrNoHash() && pcSlice->getPicHeader()->getInGdrInterval());
-      if (m_pcCfg->getDecodedPictureHashSEIType() != HASHTYPE_NONE && genHash)
+      if (m_pcCfg->getDecodedPictureHashSEIType() != HashType::NONE && genHash)
 #else
-      if (m_pcCfg->getDecodedPictureHashSEIType()!=HASHTYPE_NONE)
+      if (m_pcCfg->getDecodedPictureHashSEIType() != HashType::NONE)
 #endif
       {
         SEIDecodedPictureHash *decodedPictureHashSei = new SEIDecodedPictureHash();
@@ -4073,7 +4075,7 @@ void EncGOP::compressGOP(int pocLast, int numPicRcvd, PicList &rcListPic, std::l
       const PPS* pps = pcPic->cs->pps;
       const int numSubpics = pps->getNumSubPics();
       std::string subPicDigest;
-      if (numSubpics > 1 && m_pcCfg->getSubpicDecodedPictureHashType() != HASHTYPE_NONE )
+      if (numSubpics > 1 && m_pcCfg->getSubpicDecodedPictureHashType() != HashType::NONE)
       {
         std::vector<uint16_t> subPicIdsInPic;
         xGetSubpicIdsInPic(subPicIdsInPic, pcPic->cs->sps, pps);
diff --git a/source/Lib/EncoderLib/SEIEncoder.cpp b/source/Lib/EncoderLib/SEIEncoder.cpp
index 9bf3a1476f121d9866b8d137d8c61c07dc8fa733..70e427c69204164c5d4afdce9056184c1325d7aa 100644
--- a/source/Lib/EncoderLib/SEIEncoder.cpp
+++ b/source/Lib/EncoderLib/SEIEncoder.cpp
@@ -487,25 +487,26 @@ void SEIEncoder::initDecodedPictureHashSEI(SEIDecodedPictureHash *decodedPicture
   decodedPictureHashSEI->singleCompFlag = (m_pcCfg->getChromaFormatIdc() == 0);
   switch (m_pcCfg->getDecodedPictureHashSEIType())
   {
-    case HASHTYPE_MD5:
-      {
-        uint32_t numChar=calcMD5(pic, decodedPictureHashSEI->m_pictureHash, bitDepths);
-        rHashString = hashToString(decodedPictureHashSEI->m_pictureHash, numChar);
-      }
-      break;
-    case HASHTYPE_CRC:
-      {
-        uint32_t numChar=calcCRC(pic, decodedPictureHashSEI->m_pictureHash, bitDepths);
-        rHashString = hashToString(decodedPictureHashSEI->m_pictureHash, numChar);
-      }
-      break;
-    case HASHTYPE_CHECKSUM:
-    default:
-      {
-        uint32_t numChar=calcChecksum(pic, decodedPictureHashSEI->m_pictureHash, bitDepths);
-        rHashString = hashToString(decodedPictureHashSEI->m_pictureHash, numChar);
-      }
-      break;
+  case HashType::MD5:
+  {
+    uint32_t numChar = calcMD5(pic, decodedPictureHashSEI->m_pictureHash, bitDepths);
+    rHashString      = hashToString(decodedPictureHashSEI->m_pictureHash, numChar);
+    break;
+  }
+  break;
+  case HashType::CRC:
+  {
+    uint32_t numChar = calcCRC(pic, decodedPictureHashSEI->m_pictureHash, bitDepths);
+    rHashString      = hashToString(decodedPictureHashSEI->m_pictureHash, numChar);
+    break;
+  }
+  case HashType::CHECKSUM:
+  default:
+  {
+    uint32_t numChar = calcChecksum(pic, decodedPictureHashSEI->m_pictureHash, bitDepths);
+    rHashString      = hashToString(decodedPictureHashSEI->m_pictureHash, numChar);
+    break;
+  }
   }
 }
 
diff --git a/source/Lib/EncoderLib/SEIwrite.cpp b/source/Lib/EncoderLib/SEIwrite.cpp
index 20f104b3556c4f5a10367e6024b01ce03edc4fd3..0c899d49809cf7e38f098c1837907246381151ea 100644
--- a/source/Lib/EncoderLib/SEIwrite.cpp
+++ b/source/Lib/EncoderLib/SEIwrite.cpp
@@ -270,15 +270,23 @@ void SEIWriter::xWriteSEIDecodedPictureHash(const SEIDecodedPictureHash& sei)
   const char *traceString="\0";
   switch (sei.method)
   {
-    case HASHTYPE_MD5: traceString="picture_md5"; break;
-    case HASHTYPE_CRC: traceString="picture_crc"; break;
-    case HASHTYPE_CHECKSUM: traceString="picture_checksum"; break;
-    default: THROW("Unknown hash type"); break;
+  case HashType::MD5:
+    traceString = "picture_md5";
+    break;
+  case HashType::CRC:
+    traceString = "picture_crc";
+    break;
+  case HashType::CHECKSUM:
+    traceString = "picture_checksum";
+    break;
+  default:
+    THROW("Unknown hash type");
+    break;
   }
 
   if (traceString != 0) //use of this variable is needed to avoid a compiler error with G++ 4.6.1
   {
-    WRITE_CODE(sei.method, 8, "dph_sei_hash_type");
+    WRITE_CODE(to_underlying(sei.method), 8, "dph_sei_hash_type");
     WRITE_CODE(sei.singleCompFlag, 1, "dph_sei_single_component_flag");
     WRITE_CODE(0, 7, "dph_sei_reserved_zero_7bits");
     for(uint32_t i=0; i<uint32_t(sei.m_pictureHash.hash.size()); i++)