diff --git generic/tkBusy.c generic/tkBusy.c
index 5c5fb85e58..00ba73ed86 100644
--- generic/tkBusy.c
+++ generic/tkBusy.c
@@ -45,7 +45,7 @@ static void		BusyCustodyProc(ClientData clientData,
 static int		ConfigureBusy(Tcl_Interp *interp, Busy *busyPtr,
 			    int objc, Tcl_Obj *const objv[]);
 static Busy *		CreateBusy(Tcl_Interp *interp, Tk_Window tkRef);
-static void		DestroyBusy(void *dataPtr);
+static Tcl_FreeProc	DestroyBusy;
 static void		DoConfigureNotify(Tk_FakeWin *winPtr);
 static inline Tk_Window	FirstChild(Tk_Window parent);
 static Busy *		GetBusy(Tcl_Interp *interp,
@@ -137,7 +137,7 @@ BusyCustodyProc(
 	    busyPtr);
     TkpHideBusyWindow(busyPtr);
     busyPtr->tkBusy = NULL;
-    Tcl_EventuallyFree(busyPtr, (Tcl_FreeProc *)DestroyBusy);
+    Tcl_EventuallyFree(busyPtr, DestroyBusy);
 }
 
 /*
@@ -262,7 +262,7 @@ RefWinEventProc(
 	 * Arrange for the busy structure to be removed at a proper time.
 	 */
 
-	Tcl_EventuallyFree(busyPtr, (Tcl_FreeProc *)DestroyBusy);
+	Tcl_EventuallyFree(busyPtr, DestroyBusy);
 	break;
 
     case ConfigureNotify:
@@ -333,7 +333,7 @@ RefWinEventProc(
 
 static void
 DestroyBusy(
-    void *data)			/* Busy window structure record */
+    char *data)			/* Busy window structure record */
 {
     Busy *busyPtr = (Busy *)data;
 
@@ -383,7 +383,7 @@ BusyEventProc(
 
     if (eventPtr->type == DestroyNotify) {
 	busyPtr->tkBusy = NULL;
-	Tcl_EventuallyFree(busyPtr, (Tcl_FreeProc *)DestroyBusy);
+	Tcl_EventuallyFree(busyPtr, DestroyBusy);
     }
 }
 
@@ -901,7 +901,7 @@ Tk_BusyObjCmd(
 	    return TCL_ERROR;
 	}
 	TkpHideBusyWindow(busyPtr);
-	Tcl_EventuallyFree(busyPtr, (Tcl_FreeProc *)DestroyBusy);
+	Tcl_EventuallyFree(busyPtr, DestroyBusy);
 	return TCL_OK;
 
     case BUSY_HOLD:
diff --git generic/tkCanvas.c generic/tkCanvas.c
index b80c197ba5..aaac122490 100644
--- generic/tkCanvas.c
+++ generic/tkCanvas.c
@@ -267,7 +267,7 @@ static void		CanvasWorldChanged(ClientData instanceData);
 static int		ConfigureCanvas(Tcl_Interp *interp,
 			    TkCanvas *canvasPtr, int objc,
 			    Tcl_Obj *const *objv, int flags);
-static void		DestroyCanvas(void *memPtr);
+static Tcl_FreeProc	DestroyCanvas;
 static void		DisplayCanvas(ClientData clientData);
 static void		DoItem(Tcl_Obj *accumObj,
 			    Tk_Item *itemPtr, Tk_Uid tag);
@@ -2168,7 +2168,7 @@ CanvasWidgetCmd(
 
 static void
 DestroyCanvas(
-    void *memPtr)		/* Info about canvas widget. */
+    char *memPtr)		/* Info about canvas widget. */
 {
     TkCanvas *canvasPtr = (TkCanvas *)memPtr;
     Tk_Item *itemPtr;
@@ -2730,7 +2730,7 @@ CanvasEventProc(
 	if (canvasPtr->flags & REDRAW_PENDING) {
 	    Tcl_CancelIdleCall(DisplayCanvas, canvasPtr);
 	}
-	Tcl_EventuallyFree(canvasPtr, (Tcl_FreeProc *) DestroyCanvas);
+	Tcl_EventuallyFree(canvasPtr, DestroyCanvas);
     } else if (eventPtr->type == ConfigureNotify) {
 	canvasPtr->flags |= UPDATE_SCROLLBARS;
 
diff --git generic/tkEntry.c generic/tkEntry.c
index 86b79ac516..a5cf172069 100644
--- generic/tkEntry.c
+++ generic/tkEntry.c
@@ -396,7 +396,7 @@ static const char *const selElementNames[] = {
 static int		ConfigureEntry(Tcl_Interp *interp, Entry *entryPtr,
 			    int objc, Tcl_Obj *const objv[]);
 static int		DeleteChars(Entry *entryPtr, int index, int count);
-static void		DestroyEntry(void *memPtr);
+static Tcl_FreeProc	DestroyEntry;
 static void		DisplayEntry(ClientData clientData);
 static void		EntryBlinkProc(ClientData clientData);
 static void		EntryCmdDeletedProc(ClientData clientData);
@@ -1021,9 +1021,9 @@ EntryWidgetObjCmd(
 
 static void
 DestroyEntry(
-    void *memPtr)		/* Info about entry widget. */
+    char *memPtr)		/* Info about entry widget. */
 {
-    Entry *entryPtr = memPtr;
+    Entry *entryPtr = (Entry *) memPtr;
 
     /*
      * Free up all the stuff that requires special handling, then let
@@ -2498,7 +2498,7 @@ EntryEventProc(
 	    if (entryPtr->flags & REDRAW_PENDING) {
 		Tcl_CancelIdleCall(DisplayEntry, clientData);
 	    }
-	    Tcl_EventuallyFree(clientData, (Tcl_FreeProc *) DestroyEntry);
+	    Tcl_EventuallyFree(clientData, DestroyEntry);
 	}
 	break;
     case ConfigureNotify:
diff --git generic/tkFrame.c generic/tkFrame.c
index 4d69c16140..7c39625f0c 100644
--- generic/tkFrame.c
+++ generic/tkFrame.c
@@ -308,7 +308,7 @@ static int		ConfigureFrame(Tcl_Interp *interp, Frame *framePtr,
 static int		CreateFrame(ClientData clientData, Tcl_Interp *interp,
 			    int objc, Tcl_Obj *const objv[],
 			    enum FrameType type, const char *appName);
-static void		DestroyFrame(void *memPtr);
+static Tcl_FreeProc	DestroyFrame;
 static void		DestroyFramePartly(Frame *framePtr);
 static void		DisplayFrame(ClientData clientData);
 static void		FrameCmdDeletedProc(ClientData clientData);
@@ -857,10 +857,10 @@ FrameWidgetObjCmd(
 
 static void
 DestroyFrame(
-    void *memPtr)		/* Info about frame widget. */
+    char *memPtr)		/* Info about frame widget. */
 {
-    Frame *framePtr = memPtr;
-    Labelframe *labelframePtr = memPtr;
+    Frame *framePtr = (Frame *) memPtr;
+    Labelframe *labelframePtr = (Labelframe *) memPtr;
 
     if (framePtr->type == TYPE_LABELFRAME) {
 	Tk_FreeTextLayout(labelframePtr->textLayout);
@@ -1676,7 +1676,7 @@ FrameEventProc(
 	    Tcl_CancelIdleCall(DisplayFrame, framePtr);
 	}
 	Tcl_CancelIdleCall(MapFrame, framePtr);
-	Tcl_EventuallyFree(framePtr, (Tcl_FreeProc *) DestroyFrame);
+	Tcl_EventuallyFree(framePtr, DestroyFrame);
     } else if (eventPtr->type == FocusIn) {
 	if (eventPtr->xfocus.detail != NotifyInferior) {
 	    framePtr->flags |= GOT_FOCUS;
diff --git generic/tkGrid.c generic/tkGrid.c
index ac6b59bf4a..f1e06ba0cf 100644
--- generic/tkGrid.c
+++ generic/tkGrid.c
@@ -262,7 +262,7 @@ static int		CheckSlotData(Gridder *containerPtr, int slot,
 			    int slotType, int checkOnly);
 static int		ConfigureContent(Tcl_Interp *interp, Tk_Window tkwin,
 			    int objc, Tcl_Obj *const objv[]);
-static void		DestroyGrid(void *memPtr);
+static Tcl_FreeProc	DestroyGrid;
 static Gridder *	GetGrid(Tk_Window tkwin);
 static int		GridAnchorCommand(Tk_Window tkwin, Tcl_Interp *interp,
 			    int objc, Tcl_Obj *const objv[]);
@@ -2807,7 +2807,7 @@ Unlink(
 
 static void
 DestroyGrid(
-    void *memPtr)		/* Info about window that is now dead. */
+    char *memPtr)		/* Info about window that is now dead. */
 {
     Gridder *gridPtr = (Gridder *)memPtr;
 
@@ -2890,7 +2890,7 @@ GridStructureProc(
 	    Tcl_CancelIdleCall(ArrangeGrid, gridPtr);
 	}
 	gridPtr->tkwin = NULL;
-	Tcl_EventuallyFree(gridPtr, (Tcl_FreeProc *)DestroyGrid);
+	Tcl_EventuallyFree(gridPtr, DestroyGrid);
     } else if (eventPtr->type == MapNotify) {
 	if ((gridPtr->contentPtr != NULL)
 		&& !(gridPtr->flags & REQUESTED_RELAYOUT)) {
diff --git generic/tkListbox.c generic/tkListbox.c
index 64b16ee817..97b32f3a13 100644
--- generic/tkListbox.c
+++ generic/tkListbox.c
@@ -389,7 +389,7 @@ static int		ConfigureListboxItem(Tcl_Interp *interp,
 			    Tcl_Obj *const objv[], int index);
 static int		ListboxDeleteSubCmd(Listbox *listPtr,
 			    int first, int last);
-static void		DestroyListbox(void *memPtr);
+static Tcl_FreeProc	DestroyListbox;
 static void		DestroyListboxOptionTables(ClientData clientData,
 			    Tcl_Interp *interp);
 static void		DisplayListbox(ClientData clientData);
@@ -1436,9 +1436,9 @@ ListboxGetItemAttributes(
 
 static void
 DestroyListbox(
-    void *memPtr)		/* Info about listbox widget. */
+    char *memPtr)		/* Info about listbox widget. */
 {
-    Listbox *listPtr = memPtr;
+    Listbox *listPtr = (Listbox *) memPtr;
     Tcl_HashEntry *entry;
     Tcl_HashSearch search;
 
@@ -2619,7 +2619,7 @@ ListboxEventProc(
 	    if (listPtr->flags & REDRAW_PENDING) {
 		Tcl_CancelIdleCall(DisplayListbox, clientData);
 	    }
-	    Tcl_EventuallyFree(clientData, (Tcl_FreeProc *) DestroyListbox);
+	    Tcl_EventuallyFree(clientData, DestroyListbox);
 	}
     } else if (eventPtr->type == ConfigureNotify) {
 	int vertSpace;
diff --git generic/tkMenu.c generic/tkMenu.c
index 95a3b95176..37f192894c 100644
--- generic/tkMenu.c
+++ generic/tkMenu.c
@@ -333,7 +333,7 @@ static void		DeleteMenuCloneEntries(TkMenu *menuPtr,
 static void		DestroyMenuHashTable(ClientData clientData,
 			    Tcl_Interp *interp);
 static void		DestroyMenuInstance(TkMenu *menuPtr);
-static void		DestroyMenuEntry(void *memPtr);
+static Tcl_FreeProc	DestroyMenuEntry;
 static int		GetIndexFromCoords(Tcl_Interp *interp,
 			    TkMenu *menuPtr, const char *string,
 			    int *indexPtr);
@@ -1177,7 +1177,7 @@ DestroyMenuInstance(
 	 */
 
 	Tcl_EventuallyFree(menuPtr->entries[i],
-		(Tcl_FreeProc*)DestroyMenuEntry);
+		DestroyMenuEntry);
 	menuPtr->numEntries = i;
     }
     if (menuPtr->entries != NULL) {
@@ -1376,9 +1376,9 @@ UnhookCascadeEntry(
 
 static void
 DestroyMenuEntry(
-    void *memPtr)		/* Pointer to entry to be freed. */
+    char *memPtr)		/* Pointer to entry to be freed. */
 {
-    TkMenuEntry *mePtr = memPtr;
+    TkMenuEntry *mePtr = (TkMenuEntry *) memPtr;
     TkMenu *menuPtr = mePtr->menuPtr;
 
     if (menuPtr->postedCascade == mePtr) {
@@ -1617,7 +1617,7 @@ ConfigureMenu(
 	} else if ((menuListPtr->numEntries > 0)
 		&& (menuListPtr->entries[0]->type == TEAROFF_ENTRY)) {
 
-	    Tcl_EventuallyFree(menuListPtr->entries[0], (Tcl_FreeProc *) DestroyMenuEntry);
+	    Tcl_EventuallyFree(menuListPtr->entries[0], DestroyMenuEntry);
 
 	    for (i = 0; i < menuListPtr->numEntries - 1; i++) {
 		menuListPtr->entries[i] = menuListPtr->entries[i + 1];
@@ -2386,7 +2386,7 @@ MenuAddOrInsert(
 		    errorMenuPtr != NULL;
 		    errorMenuPtr = errorMenuPtr->nextInstancePtr) {
     		Tcl_EventuallyFree(errorMenuPtr->entries[index],
-    	    		(Tcl_FreeProc *) DestroyMenuEntry);
+			DestroyMenuEntry);
 		for (i = index; i < errorMenuPtr->numEntries - 1; i++) {
 		    errorMenuPtr->entries[i] = errorMenuPtr->entries[i + 1];
 		    errorMenuPtr->entries[i]->index = i;
@@ -3521,7 +3521,7 @@ DeleteMenuCloneEntries(
     for (menuListPtr = menuPtr->masterMenuPtr; menuListPtr != NULL;
 	    menuListPtr = menuListPtr->nextInstancePtr) {
 	for (i = last; i >= first; i--) {
-	    Tcl_EventuallyFree(menuListPtr->entries[i], (Tcl_FreeProc *) DestroyMenuEntry);
+	    Tcl_EventuallyFree(menuListPtr->entries[i], DestroyMenuEntry);
 	}
 	for (i = last + 1; i < menuListPtr->numEntries; i++) {
 	    j = i - numDeleted;
diff --git generic/tkPack.c generic/tkPack.c
index b3b7228dd5..1412a9d397 100644
--- generic/tkPack.c
+++ generic/tkPack.c
@@ -120,7 +120,7 @@ static const Tk_GeomMgr packerType = {
 static void		ArrangePacking(ClientData clientData);
 static int		ConfigureContent(Tcl_Interp *interp, Tk_Window tkwin,
 			    int objc, Tcl_Obj *const objv[]);
-static void		DestroyPacker(void *memPtr);
+static Tcl_FreeProc	DestroyPacker;
 static Packer *		GetPacker(Tk_Window tkwin);
 static int		PackAfter(Tcl_Interp *interp, Packer *prevPtr,
 			    Packer *containerPtr, int objc,Tcl_Obj *const objv[]);
@@ -1388,7 +1388,7 @@ Unlink(
 
 static void
 DestroyPacker(
-    void *memPtr)		/* Info about packed window that is now
+    char *memPtr)		/* Info about packed window that is now
 				 * dead. */
 {
     Packer *packPtr = (Packer *)memPtr;
@@ -1465,7 +1465,7 @@ PackStructureProc(
 	    Tcl_CancelIdleCall(ArrangePacking, packPtr);
 	}
 	packPtr->tkwin = NULL;
-	Tcl_EventuallyFree(packPtr, (Tcl_FreeProc *) DestroyPacker);
+	Tcl_EventuallyFree(packPtr, DestroyPacker);
     } else if (eventPtr->type == MapNotify) {
 	/*
 	 * When a container gets mapped, must redo the geometry computation so
diff --git generic/tkSquare.c generic/tkSquare.c
index 61f86c5cc1..9b70ba3ee6 100644
--- generic/tkSquare.c
+++ generic/tkSquare.c
@@ -98,7 +98,6 @@ static const Tk_OptionSpec optionSpecs[] = {
 
 static void		SquareDeletedProc(ClientData clientData);
 static int		SquareConfigure(Tcl_Interp *interp, Square *squarePtr);
-static void		SquareDestroy(void *memPtr);
 static void		SquareDisplay(ClientData clientData);
 static void		KeepInWindow(Square *squarePtr);
 static void		SquareObjEventProc(ClientData clientData,
@@ -410,7 +409,7 @@ SquareObjEventProc(
 	if (squarePtr->updatePending) {
 	    Tcl_CancelIdleCall(SquareDisplay, squarePtr);
 	}
-	Tcl_EventuallyFree(squarePtr, (Tcl_FreeProc *) SquareDestroy);
+	Tcl_EventuallyFree(squarePtr, TCL_DYNAMIC);
     }
 }
 
@@ -534,33 +533,6 @@ SquareDisplay(
     }
 }
 
-/*
- *----------------------------------------------------------------------
- *
- * SquareDestroy --
- *
- *	This procedure is invoked by Tcl_EventuallyFree or Tcl_Release to
- *	clean up the internal structure of a square at a safe time (when
- *	no-one is using it anymore).
- *
- * Results:
- *	None.
- *
- * Side effects:
- *	Everything associated with the square is freed up.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-SquareDestroy(
-    void *memPtr)		/* Info about square widget. */
-{
-    Square *squarePtr = memPtr;
-
-    ckfree(squarePtr);
-}
-
 /*
  *----------------------------------------------------------------------
  *
diff --git generic/ttk/ttkWidget.c generic/ttk/ttkWidget.c
index 9fa8ec0ffb..75ca39cb08 100644
--- generic/ttk/ttkWidget.c
+++ generic/ttk/ttkWidget.c
@@ -201,15 +201,6 @@ WidgetInstanceObjCmdDeleted(ClientData clientData)
 	Tk_DestroyWindow(corePtr->tkwin);
 }
 
-/* FreeWidget --
- *	 Final cleanup for widget; called via Tcl_EventuallyFree().
- */
-static void
-FreeWidget(void *memPtr)
-{
-    ckfree(memPtr);
-}
-
 /* DestroyWidget --
  * 	Main widget destructor; called from <DestroyNotify> event handler.
  */
@@ -238,7 +229,7 @@ DestroyWidget(WidgetCore *corePtr)
 	/* NB: this can reenter the interpreter via a command traces */
 	Tcl_DeleteCommandFromToken(corePtr->interp, cmd);
     }
-    Tcl_EventuallyFree(corePtr, (Tcl_FreeProc *) FreeWidget);
+    Tcl_EventuallyFree(corePtr, TCL_DYNAMIC);
 }
 
 /*
