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