How to avoid multiple type definitions due to different kinds?

Thanks @msz59 for your reply.

Using interface procedure it is possible, but I am looking for other possibilities.

MODULE MOD_REL

   TYPE :: TYP_REL(k)
      INTEGER, KIND :: k = 8
      REAL(KIND=k), ALLOCATABLE, DIMENSION(:, :) :: value
   END TYPE TYP_REL


INTERFACE PRC1
  MODULE PROCEDURE PRC1_REL8
  MODULE PROCEDURE PRC1_REL16
END INTERFACE PRC1



CONTAINS

    SUBROUTINE PRC1_REL8(this)
        CLASS(TYP_REL(k=8)) :: this
        PRINT *, this%k
    END SUBROUTINE PRC1_REL8


    SUBROUTINE PRC1_REL16(this)
        CLASS(TYP_REL(k=16)) :: this
        PRINT *, this%k
    END SUBROUTINE PRC1_REL16

END MODULE MOD_REL
PROGRAM MAIN

   USE MOD_REL
   IMPLICIT NONE

   INTEGER :: istat
   CHARACTER(len=80) :: msg
   TYPE (TYP_REL(k=8))  :: r8
   TYPE (TYP_REL(k=16)) :: r16

   ALLOCATE(r8%value(10,10), stat=istat, errmsg=msg, source=8.0_8)
   IF ( istat /= 0 ) STOP msg
   ALLOCATE(r16%value(5,5), stat=istat, errmsg=msg, source=16.0_16)
   IF ( istat /= 0 ) STOP msg
   CALL PRC1(r8)
   CALL PRC1(r16)
   PRINT *, shape(r8%value), shape(r16%value), r8%value(1,1), r16%value(1,1)

END PROGRAM MAIN