diff --git a/ghc/compiler/basicTypes/Unique.lhs b/ghc/compiler/basicTypes/Unique.lhs
index 2a79917cf8c4add9cb49130adb57a7f7e25ddf47..040bf5fa8eac6a4187ef092a6e8565b960c00dcd 100644
--- a/ghc/compiler/basicTypes/Unique.lhs
+++ b/ghc/compiler/basicTypes/Unique.lhs
@@ -204,6 +204,7 @@ module Unique (
 	unpackCStringFoldrIdKey,
 	unpackCStringIdKey,
 	ureadListIdKey,
+	unsafeCoerceIdKey,
 	ushowListIdKey,
 	voidIdKey,
 	voidTyConKey,
@@ -666,48 +667,49 @@ unpackCString2IdKey	      = mkPreludeMiscIdUnique 36
 unpackCStringAppendIdKey      = mkPreludeMiscIdUnique 37
 unpackCStringFoldrIdKey	      = mkPreludeMiscIdUnique 38
 unpackCStringIdKey	      = mkPreludeMiscIdUnique 39
-voidIdKey		      = mkPreludeMiscIdUnique 40
-ushowListIdKey		      = mkPreludeMiscIdUnique 41
-ureadListIdKey		      = mkPreludeMiscIdUnique 42
-
-copyableIdKey		= mkPreludeMiscIdUnique 43
-noFollowIdKey		= mkPreludeMiscIdUnique 44
-parAtAbsIdKey		= mkPreludeMiscIdUnique 45
-parAtForNowIdKey	= mkPreludeMiscIdUnique 46
-parAtIdKey		= mkPreludeMiscIdUnique 47
-parAtRelIdKey		= mkPreludeMiscIdUnique 48
-parGlobalIdKey		= mkPreludeMiscIdUnique 49
-parLocalIdKey		= mkPreludeMiscIdUnique 50
+unsafeCoerceIdKey	      = mkPreludeMiscIdUnique 40
+voidIdKey		      = mkPreludeMiscIdUnique 41
+ushowListIdKey		      = mkPreludeMiscIdUnique 42
+ureadListIdKey		      = mkPreludeMiscIdUnique 43
+
+copyableIdKey		= mkPreludeMiscIdUnique 44
+noFollowIdKey		= mkPreludeMiscIdUnique 45
+parAtAbsIdKey		= mkPreludeMiscIdUnique 46
+parAtForNowIdKey	= mkPreludeMiscIdUnique 47
+parAtIdKey		= mkPreludeMiscIdUnique 48
+parAtRelIdKey		= mkPreludeMiscIdUnique 49
+parGlobalIdKey		= mkPreludeMiscIdUnique 50
+parLocalIdKey		= mkPreludeMiscIdUnique 51
 \end{code}
 
 Certain class operations from Prelude classes.  They get
 their own uniques so we can look them up easily when we want
 to conjure them up during type checking.        
 \begin{code}					  
-fromIntClassOpKey	= mkPreludeMiscIdUnique 51
-fromIntegerClassOpKey	= mkPreludeMiscIdUnique 52
-minusClassOpKey		= mkPreludeMiscIdUnique 53
-fromRationalClassOpKey	= mkPreludeMiscIdUnique 54
-enumFromClassOpKey	= mkPreludeMiscIdUnique 55
-enumFromThenClassOpKey	= mkPreludeMiscIdUnique 56
-enumFromToClassOpKey	= mkPreludeMiscIdUnique 57
-enumFromThenToClassOpKey= mkPreludeMiscIdUnique 58
-eqClassOpKey		= mkPreludeMiscIdUnique 59
-geClassOpKey		= mkPreludeMiscIdUnique 60
-zeroClassOpKey		= mkPreludeMiscIdUnique 61
-thenMClassOpKey		= mkPreludeMiscIdUnique 62 -- (>>=)
-unboundKey		= mkPreludeMiscIdUnique 63	-- Just a place holder for unbound
+fromIntClassOpKey	= mkPreludeMiscIdUnique 52
+fromIntegerClassOpKey	= mkPreludeMiscIdUnique 53
+minusClassOpKey		= mkPreludeMiscIdUnique 54
+fromRationalClassOpKey	= mkPreludeMiscIdUnique 55
+enumFromClassOpKey	= mkPreludeMiscIdUnique 56
+enumFromThenClassOpKey	= mkPreludeMiscIdUnique 57
+enumFromToClassOpKey	= mkPreludeMiscIdUnique 58
+enumFromThenToClassOpKey= mkPreludeMiscIdUnique 59
+eqClassOpKey		= mkPreludeMiscIdUnique 50
+geClassOpKey		= mkPreludeMiscIdUnique 61
+zeroClassOpKey		= mkPreludeMiscIdUnique 62
+thenMClassOpKey		= mkPreludeMiscIdUnique 63 -- (>>=)
+unboundKey		= mkPreludeMiscIdUnique 64	-- Just a place holder for unbound
 							-- variables produced by the renamer
-fromEnumClassOpKey	= mkPreludeMiscIdUnique 64
+fromEnumClassOpKey	= mkPreludeMiscIdUnique 65
 
-mainKey			= mkPreludeMiscIdUnique 65
-returnMClassOpKey	= mkPreludeMiscIdUnique 66
-otherwiseIdKey		= mkPreludeMiscIdUnique 67
-toEnumClassOpKey	= mkPreludeMiscIdUnique 68
+mainKey			= mkPreludeMiscIdUnique 66
+returnMClassOpKey	= mkPreludeMiscIdUnique 67
+otherwiseIdKey		= mkPreludeMiscIdUnique 68
+toEnumClassOpKey	= mkPreludeMiscIdUnique 69
 \end{code}
 
 \begin{code}
-inlineIdKey		= mkPreludeMiscIdUnique 69
-coerceIdKey		= mkPreludeMiscIdUnique 70
-assertIdKey		= mkPreludeMiscIdUnique 71
+inlineIdKey		= mkPreludeMiscIdUnique 70
+coerceIdKey		= mkPreludeMiscIdUnique 71
+assertIdKey		= mkPreludeMiscIdUnique 72
 \end{code}
diff --git a/ghc/compiler/prelude/PrelInfo.lhs b/ghc/compiler/prelude/PrelInfo.lhs
index 692e6753214729679d8428cc5c61108a728ea3ba..d6caf24710fefcc03e9760bacebb7af121cd8f2d 100644
--- a/ghc/compiler/prelude/PrelInfo.lhs
+++ b/ghc/compiler/prelude/PrelInfo.lhs
@@ -208,6 +208,7 @@ wired_in_ids
     , unpackCStringAppendId
     , unpackCStringFoldrId
     , unpackCStringId
+    , unsafeCoerceId
     , voidId
 
 --  , copyableId
diff --git a/ghc/compiler/prelude/PrelVals.lhs b/ghc/compiler/prelude/PrelVals.lhs
index b22559b1f6338d715a16a2417fbc58f7a45e999d..1aea62cc0085a7ecfe22063253311c3f08211f9c 100644
--- a/ghc/compiler/prelude/PrelVals.lhs
+++ b/ghc/compiler/prelude/PrelVals.lhs
@@ -116,6 +116,21 @@ errorTy  = mkSigmaTy [openAlphaTyVar] [] (mkFunTys [mkListTy charTy] openAlphaTy
     -- returns, so the return type is irrelevant.
 \end{code}
 
+unsafeCoerce# isn't so much a PrimOp as a phantom identifier, that
+just gets expanded into a type coercion wherever it occurs.  Hence we
+add it as a built-in Id with an unfolding here.
+
+\begin{code}
+unsafeCoerceId
+  = pcMiscPrelId unsafeCoerceIdKey pREL_GHC SLIT("unsafeCoerce#") ty
+	(mk_inline_unfolding template)
+  where
+    ty = mkForAllTys [alphaTyVar,betaTyVar] (mkFunTy alphaTy betaTy)
+    [x] = mkTemplateLocals [alphaTy]
+    template = mkLam [alphaTyVar,betaTyVar] [x] (
+		  Note (Coerce betaTy alphaTy) (Var x))
+\end{code}
+
 We want \tr{GHCbase.trace} to be wired in
 because we don't want the strictness analyser to get ahold of it,
 decide that the second argument is strict, evaluate that first (!!),